在S.O的question中,接受的答案建议使用匿名函数和工厂模式来处理PDO连接。我相信在需要建立与不同数据库的连接的情况下使用匿名函数,将为其定义不同的函数。在这种情况下,是否可以将匿名函数移动到工厂类本身仅用于单个数据库?
这就是我的想法
class StructureFactory
{
protected $provider = null;
protected $connection = null;
public function __construct( )
{
$this->provider = function() {
$instance = new PDO('mysql:......;charset=utf8', 'username', 'password');
$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $instance;
};
}
public function create( $name )
{
if ( $this->connection === null )
{
$this->connection = call_user_func( $this->provider );
}
return new $name( $this->connection );
}
}
另外,即使采用这种方法,为什么不仅仅将PDO参数传递给构造函数也能实现原始答案试图实现的目的,即建立不同的连接?
类似的东西:
class StructureFactory
{
protected $provider = null;
protected $connection = null;
public function __construct( $PDO_Params )
{
$this->provider = function() {
$instance = new PDO($PDO_Params["dsn"], $PDO_Params["username"], $PDO_Params["password"]);
$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $instance;
};
}
public function create( $name)
{
if ( $this->connection === null )
{
$this->connection = call_user_func( $this->provider );
}
return new $name( $this->connection );
}
}
答案 0 :(得分:0)
没有。因为这样你就可以从依赖注入中获得任何好处。
您可以做的修改是:直接在工厂中注入初始化的PDO实例,而不是使用这种延迟加载方法。有点像this answer。
我还建议您观看this lecture。