ZF Autoloader atası ve istenen sınıfı yüklemek için

2 Cevap php

Varolan bir uygulama içine Zend Framework entegre ediyorum. I include() tabloların onlarca yerine zerdüştlerin autoloading mekanizması uygulama üzerinden geçmek istiyorum.

Gerçi autoloading mekanizması için özel bir şartı var. Bana ayrıntılı sağlar.

Mevcut uygulama, örneğin, (ZF bağımsız) bir çekirdek kütüphanesi kullanır:

/Core/Library/authentication.php
/Core/Library/translation.php
/Core/Library/messages.php

Bu çekirdek kütüphane her zaman bakir kalması ve uygulamaları bir dizi hizmet vermektedir. Kütüphane gibi sınıfları içerir

class ancestor_authentication { ... }
class ancestor_translation { ... }
class ancestor_messages { ... }

in application, Kütüphane dizin de var:

/App/Library/authentication.php
/App/Library/translation.php
/App/Library/messages.php

Bu ata sınıfları uzatmak ve aslında uygulama örneği olsun olanlardır içerir.

class authentication extends ancestor_authentication { }
class translation extends ancestor_translation { }
class messages extends ancestor_messages { }

Genellikle, bu sınıf tanımları boş. Onlar sadece kendi atalarını genişletmek ve örneğini sınıf adını sağlar.

$authentication = new authentication();

Bu çözümün amacı, kolayca çekirdek kütüphaneleri yama zorunda kalmadan uygulaması açısından özelleştirebileceksiniz olmaktır.

Şimdi, gerek autoloader bu yapının farkında olmak gerekir. Sınıfın bir amacı, authentication talep edildiğinde, otomatik yükleyici gerekir:

1. load  /Core/Library/authentication.php
2. load  /App/Library/authentication.php

Benim geçerli yaklaşım, özel bir işlev oluştururken, ve belirli bir ad alanı öneki için Zend_Loader_Autoloader bu bağlayıcı olacaktır.

  • Ben bakan olduğumu Zend bunu yapmanın bir yolu zaten var mı? this question olarak kabul edilen yanıt tür olduğu anlamına gelir, ama bu ifadeler sadece kötü bir seçim olabilir.

  • Bunu yapmak Zend Yükleyici'ye uzantıları var mı?

  • Eğer Can - Ben ZF yeni am - Bu işlevselliği ile Autoloader uzanan, çerçeve ruhuna uygun, zarif bir şekilde düşünmek? Ben hazır uygulanması için gerekli arayan değilim, bazı noktalar (Bu, böyle çağırır ... xyz yöntemine bir uzantısı olmalıdır) zaten yeterli olacaktır.

2 Cevap

Gordon zaten işaret ne uzatmak için, ben uygular Zend_Loader_Autoloader_Interface kendi autoloader sınıfı oluşturmak ve Zend_Loader_Autoloader-yığına o itmek istiyorum.

class My_Autoloader implements Zend_Loader_Autoloader_Interface 
{
    public function autoload($class) 
    {
        // add your logic to find the required classes in here
    }
}

$autoloader = Zend_Loader_Autoloader::getInstance();
// pushAutoloader() or unshiftAutoloader() depending on where 
// you'd like to put your autoloader on the stack
// note that we leave the $namespace parameter empty
// as your classes don't share a common namespace
$autoloader->pushAutoloader(new My_Autoloader(), '');

Ben henüz önerilmemektedir değil olsa bile, gibi Zend_Loader yaklaşımı ile gitmek olmaz, yeni Zend_Loader_Autoloader şu anda en iyi uygulama gibi görünüyor.

Bkz manual on Zend_Loader:

Varsayılan olarak, autoloader "Zend_" ve "ZendX_" ad maç için yapılandırılır. Kendi ad kullanan kendi kitaplık kodu varsa, registerNamespace () yöntemini kullanarak otomatik yükleyici ile kayıt olabilirsiniz.

$autoloader->registerNamespace('My_');

Autoloader Adlandırma Kuralı ZF takip unutmayın, böylece Zend_Foo_Bar görüneceğini Zend/Foo/Bar.php.

Bununla birlikte,

Ayrıca isteğe bağlı olarak belirli bir ad (veya ad alanları grubu) ile, keyfi autoloader geri çağrıları kayıt olabilirsiniz. Zend_Loader_Autoloader kendi iç autoloading mekanizmasını kullanarak önce bu ilk maç için çalışacaktır.

$autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');

Başka bir yol create custom class Loader extending Zend_Loader olmak ve daha sonra kaydetmek istiyorum:

Zend_Loader::registerAutoload('My_Loader');

ZF sonra bu autoloader yerine varsayılan kullanacağız.