ZF версия: 1.11.2
Я хочу создать абстрактный класс, который содержит мой адаптер БД. Упрощенно это выглядит так:
<?php
class Application_Model_DbTable_Abstract extends Zend_Db_Table_Abstract
{
protected $_dbAdapter = null;
/**
* @return null
*/
public function getDbAdapter()
{
return $this->_dbAdapter;
}
/**
* @param null $dbAdapter
*/
public function setDbAdapter($dbAdapter)
{
$this->_dbAdapter = $dbAdapter;
}
public function __construct()
{
\Zend_Debug::dump($this->getAdapter(), 'Datei: ' . __FILE__ . '<br/>Zeile: ' . __LINE__, true); die;
}
}
Но мой дамп возвращает ноль. В базовом классе модели (который происходит от Zend_D b_Table_Abstract) тот же дамп возвращает объект Zend_Db_Adapter_Pdo_Mysql. Зачем?
Я немного посмотрел на исходный код Zend DB, чтобы освежить мою память. Если вы измените свой конструктор на это:
public function __construct($config = array())
{
parent::__construct($config);
\Zend_Debug::dump($this->getAdapter(), 'Datei: ' . __FILE__ . '<br/>Zeile: ' . __LINE__, true); die;
}
Это должно работать больше, как вы ожидаете.
Отвечая на вопрос из вашего комментария: getAdapter()
метод Zend_Db_Table_Abstract
просто возвращает все, что есть в переменной адаптера БД. Это ничего не делает со значением по умолчанию. Кроме того, поскольку ваш класс переопределяет этот метод, вместо него будет использоваться ваша версия.
Конструктор в Zend_Db_Table_Abstract
class установит значение по умолчанию, если оно не было предоставлено, поэтому вызов родительского конструктора, как в моем примере, должен гарантировать, что установлен адаптер по умолчанию.
Кроме того, ZF1 — это конец жизни. Вы не должны использовать его для новых приложений и должны планировать миграцию для текущих.
Других решений пока нет …