В этом вопрос здесь, в S.O, принятый ответ предлагает использовать как анонимную функцию, так и фабричный шаблон для работы с 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 );
}
}
Нет. Потому что таким образом вы теряете любые выгоды от внедрения зависимости.
Модификация, которую вы могли бы сделать: внедрить инициализированный экземпляр PDO непосредственно на фабрике, вместо того, чтобы использовать этот подход с отложенной загрузкой. Вроде как в этот ответ.
Я также рекомендовал бы смотреть эта лекция.
Других решений пока нет …