Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在服务容器中实现单例访问?_Php_Dependency Injection_Singleton - Fatal编程技术网

Php 如何在服务容器中实现单例访问?

Php 如何在服务容器中实现单例访问?,php,dependency-injection,singleton,Php,Dependency Injection,Singleton,我有一个类,作为管理提供者的服务容器 依赖注入的一种方式 class Container { private $providers = array(); // providers array public function __construct() { } /** * Sets the provider * @param string $name - provider's name * @param string|object|array|resource|closure - p

我有一个类,作为管理提供者的服务容器 依赖注入的一种方式

class Container {

private $providers = array(); // providers array

public function __construct() {

}

/**
 * Sets the provider
 * @param string $name - provider's name
 * @param string|object|array|resource|closure - provider
 * @param boolean $singleton
 */
public function set($name, $provider, $singleton = false) {

    if ($singleton === false || ($singleton === true && !isset($this->providers[$name]))) {
        $this->providers[$name] = $provider;
    }
}

/**
 * Gets the provider
 * @param string $name
 * @param array $params
 * @return string|object|array|resource
 */
public function get($name, $params = array()) {

    if (isset($this->providers[$name])) {

        if (is_scalar($this->providers[$name]) || (is_object($this->providers[$name]) && !$this->providers[$name] instanceof Closure) || is_resource($this->providers[$name]) || is_array($this->providers[$name]))
            return $this->providers[$name];

        elseif ($this->providers[$name] instanceof Closure)
            // call a callback with an array of parameters
            return call_user_func_array($this->providers[$name], $params);

        else
            return "Provider type isn't correct.";
    }
    return "Provider " .$name. " doesn't exist.";
} }
现在,如果set方法中的第三个参数为true,我需要实现单例访问。因此,如果singleton==true,set方法应该始终为result返回相同的实例。如果提供程序不是闭包,则将其视为常量

例如:

$container = new Container();    

$dsn = "mysql:host=localhost;dbname=some_name"; // Host and db name
$user = "root"; // MySQL user name
$pass = "root"; // MySQL password

$container->set("db", function($dsn, $user, $pass) {
    return new \PDO($dsn, $user, $pass);
}, true);

$db_data = array($dsn, $user, $pass);

$db = $container->get("db", $db_data);
$db2 = $container->get("db", $db_data);
$db === $db2; // This should to return TRUE <--- This is the goal
$container=新容器();
$dsn=“mysql:host=localhost;dbname=some_name”;//主机名和数据库名
$user=“root”//MySQL用户名
$pass=“root”//MySQL密码
$container->set(“db”、函数($dsn、$user、$pass){
返回new\PDO($dsn,$user,$pass);
},对);
$db_data=array($dsn,$user,$pass);
$db=$container->get(“db”,$db\u数据);
$db2=$container->get(“db”,$db_数据);

$db===$db2;//这应该是真的,也许你应该考虑一下。它可以帮助你进行依赖注入我已经看过了,但它帮不了我。这是一个任务,不是一个真正的项目,我不能使用任何框架或其他人的代码。因此,我需要一个只使用纯PHP的代码专用解决方案。