Neden bir sınıfın birden çok kez redeclared olsun demek?

2 Cevap php

Tamam burada benim denetleyici eylemleri modelleri başlatmak için kullanabileceğiniz bir yöntemdir:

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];
}

I () yöntemi _getTable çağırdığınızda Sonra iki kez (örneğin kez init () yöntemi ve bir kez denetleyici eylem) o yazdırır:

test test test test test test

Sayfanın üstünde. Sadece) kontrol edin (çünkü array_key_exists bir _tables dizi () dan nesneyi döndürmek gerekmez mi? Yöntem birden çok kez çağrılır diğer bir deyişle () fonksiyonu sadece bir kez array_key_exists içindeki kısmı idam almak gerekmez mi?

GÜNCELLEME:

Düzen iki kez basılmış olur nedense (yani basılı düzeni var ve düzeni () olduğu layout'ta - -> içeriği;> tekrar düzeni yazdırır?) Yani sorun bu. Ben localhost Ayrıca önceki sunucu üzerinde iyi çalıştı ve gibi yapar neden hiçbir fikrim yok.

2 Cevap

Pasajı size göstereceğim:

protected $this->_tables = array();

Bu geçerli sözdizimi değil, bu olmalıdır:

protected $_tables = array();

Ayrıca, neden sadece kullanmak include_once ve PHP sizin için halledeyim değil? Alternatif olarak, Zend_Loader kullanabilirsiniz. Tekerleği yeniden icat etmeyin.

Ne gerçekten aradığınız modül tabanlı kaynakların yükleniyor. Bunun yerine tekerleği yeniden icat, neden sadece ZF (modülü) kaynak autoloaders kullanmak değil mi? De belgelerine bakın:

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

(Ben değil mi varsayarak) Zend_Application kullandığınızda, otomatik olarak bu olsun. Eğer böyle bir şey yapabileceğini yapmazsanız

$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        

Bu yaklaşım biraz naif olduğunu, ancak bu size güzel autoloading vermelidir.