2010-02-22 2 views
0

Хорошо здесь метод я использую для инициализации модели в моих действиях контроллера:Почему класс получает повторное оформление несколько раз?

protected $_tables = array(); 

protected function _getTable($table) 
{ 
    if (false === array_key_exists($table, $this->_tables)) { 
     include APPLICATION_PATH . '/modules/' 
     . $this->_request->getModuleName() . '/models/' . $table . '.php'; 
     $this->_tables[$table] = new $table(); 
     echo 'test '; 
    } 
    return $this->_tables[$table]; 
} 

Затем, когда я вызываю метод _getTable() два раза (например, один раз в методе Init() и один раз в действии контроллера) печатает:

test test test test test test 

В верхней части страницы. Не следует ли просто вернуть объект из массива _tables() из-за проверки array_key_exists()? Другими словами, не должна ли часть внутри функции array_key_exists() выполняться только один раз, когда метод вызывается несколько раз?

UPDATE:

Таким образом, проблема заключается в следующем - по какой-то причине расположение получает в два раза печатается (так это расположение печатных и внутри макета, где есть макет() -> содержание;> он снова печатает макет?). Я понятия не имею, почему он делает это, так как он хорошо работает на предыдущем сервере, а также на локальном хосте.

+0

Вы уверены, что ваши переменные/свойства содержат то, что вы ожидаете от них? Что вы получите, если добавить что-то вроде 'var_dump ($ table, $ this -> _ tables);' в начале вашего метода '_getTable'? –

+0

Вы также можете заменить «echo» test '; 'на' echo' testing {$ table}. ";' - возможно, вы звоните в другое место, о котором вы забыли. – thetaiko

+0

Когда я var_dump массив _tables, он выглядит так, как должен, нет повторяющихся записей. –

ответ

3

В этом фрагменте вы показываете:

protected $this->_tables = array(); 

Это не действительный синтаксис, он должен быть:

protected $_tables = array(); 

Кроме того, почему бы не просто использовать include_once и пусть PHP обрабатывать это для вас? Кроме того, вы можете использовать Zend_Loader. Не изобретайте велосипед.

1

Что вы действительно ищете, это загрузка ресурсов на основе модулей. Вместо того, чтобы повторно изобретать колесо, почему бы просто не использовать (модульный) ресурс автозагрузчиков ZF? Обратитесь к документации по адресу:

http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html

При использовании Zend_Application (я предполагаю, что вы не), вы получаете их автоматически. Если вы не вы могли бы сделать что-то вроде

$loaders = array(); 
$frontController = Zend_Controller_Front::getInstance(); 

foreach($frontController->getControllerDirectory() as $module => $directory) { 

    $resourceLoader = new Zend_Application_Module_Autoloader(array(
     'namespace' => ucfirst($module) . '_', 
     'basePath' => dirname($directory), 
    )); 

    $resourceLoader->addResourceTypes(array(
     'table' => array(
      'path'  => 'models/', 
      'namespace' => 'Table' 
    )); 

    $loaders[$module] = $resourceLoader; 
} 
//build array of loaders 

$loader = Zend_Loader_Autoloader::getInstance(); 
$loader->setAutoloaders($loaders); 
//set them in the autoloader   

Этот подход немного наивно, но это должно дать вам хороший автозагрузку.

+0

Я фактически использую Zend_Application, но вместо Zend_Loader я использую собственную функцию php __autoload(), подобную этой функции. __autoload ($ class) { включает str_replace ('_', '/', $ class). '.php'; }. В любом случае, я уже решил проблему, был плагин контроллера, который мешал и вызывал все проблемы, он работает сейчас :) –

Смежные вопросы