2017-05-11 6 views
0

このquestionここのS.Oでは、PDO接続を処理するために、無名関数と工場パターンの両方を使用することを提案しています。私は、別のデータベースへの接続が確立される必要がある場合には、無名関数が使用されると信じています。異なる関数が定義されます。その場合、匿名関数を単一のデータベースのためのファクトリクラス自体に移動することは問題ありませんか?工場内のPDO匿名機能

これは私もこのアプローチは、なぜだけのオリジナルの答えは異なる接続を確立するためにすなわち、達成しようとしていたものを達成コンストラクタに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); 
    } 

} 

ていたものでしょうか?

のような何か:

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

@ YourCommonSense私はその部分を理解しましたが、その無名関数もコンストラクタの一部である可能性があります。 –

+0

@feetnappyコンストラクタは、クラスを単体テストできないため、ロジックを含むべきではありません。 –

答えて

0

いいえ、あなたが依存性注入から任意の利益をロースそのようので。

この遅延ロードアプローチを使用する代わりに、初期化されたPDOインスタンスを工場に直接注入することができます。キンダーのようなthis answer

また、this lectureを見ることをおすすめします。

関連する問題