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的代码专用解决方案。