工厂里面的PDO匿名功能

时间:2017-05-11 04:02:20

标签: php oop pdo anonymous-function factory-pattern

在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 );
    }

}

1 个答案:

答案 0 :(得分:0)

没有。因为这样你就可以从依赖注入中获得任何好处。

您可以做的修改是:直接在工厂中注入初始化的PDO实例,而不是使用这种延迟加载方法。有点像this answer

我还建议您观看this lecture