2010-01-08 27 views
0

如何禁用Zend_Loader_Autoloader?禁用Zend自動加載器

+4

爲什麼要在沒有自動裝載機的情況下使用ZF? – 2010-01-08 17:29:45

+2

ZF只是我應用程序的一小部分。我使用其他自動裝載機。 – powtac 2010-01-08 20:36:57

回答

3

你可以手動強制自動裝卸載,但是這可能會導致麻煩的組件取決於它正在註冊:確保你的其他裝載機覆蓋。

spl_autoload_unregister(array('Zend_Loader_Autoloader','autoload')); 

我剝這個從Zend_Loader_Autoloader的構造,並改變了它的上班族外,並註銷而不是註冊的裝載機。

+0

我會試試這個解決方案。我認爲最合適。我不想使用Z_Autoloader :: unload()的東西,它似乎不能正常工作。 – powtac 2010-01-18 20:19:35

+0

我必須在'$ application-> bootstrap() - > run();'之前插入'spl_autoload_unregister(array('Zend_Loader_Autoloader','autoload'));'。我必須通過'spl_autoload_register('__ autoload')註冊我自己的自動加載;'這似乎工作。 – powtac 2010-01-29 10:59:10

1

有關在bootstrap.php中

protected function _initAutoloader() 
{ 

     $this->getApplication() 
      ->getAutoLoader() 
      ->unregisterNamespace("Zend"); 

     // or 
     $this->getApplication() 
      ->getAutoloader() 
      ->removeAutoloader(); 
} 
+0

不起作用,這是一個不推薦的函數調用。 – powtac 2010-01-08 20:37:35

+0

我更新了應該符合新Zend_Loader_Autoload API的代碼。 – Travis 2010-01-09 00:09:26

+1

順便說一句,格式是每個答案的關鍵因素。 – 2010-01-16 01:18:47

0

我建議使用自動裝彈機的「推自動加載」的方法,它可以收到其他自動加載機實例,並調用它時,命名空間匹配的內容。因此,您可以使用自動加載器和zend的一個...

+0

我不想同時使用,我已經檢查過這個選項。我真的想禁用ZF Autoloader。 – powtac 2010-01-08 21:07:40

+0

然後就是不要使用它(=不要調用require_once)。它不會在其他地方使用。 – 2010-01-10 10:14:52

+0

@ tomas.fejfar當您不調用require_one時,將調用自動加載器。此外,他的問題是取消裝載機以取代它。 – 2010-01-16 20:01:18

1

我假設您使用Zend_Application,它會自動設置PHP環境,自動加載和自舉。這非常方便。可悲的是,建立Zend_Autoloader是硬編碼到構造函數中,我看不出有什麼方法來覆蓋它:

public function __construct($environment, $options = null) 
{ 
    $this->_environment = (string) $environment; 

    require_once 'Zend/Loader/Autoloader.php'; 
    $this->_autoloader = Zend_Loader_Autoloader::getInstance(); 

    //snip 
} 

我的第一個建議是找到一種方法,使Zend_Autoloader,和諧的其他自動加載工作。我一直使用Zend_Autoloader與新的Doctrine::IsolatedClassLoader沒有問題。有關明確自動加載器命名空間或使用pushAutoloader()的建議是有效的,並且應該有效。

但是,如果這不是一種選擇,那麼您應該放棄使用Zend_Application,並自行處理環境設置和引導。雖然不便,但這不應該太困難。版本1.8之前的大多數ZF教程(這是介紹Zend_Application時)提供了示例。

這裏的幻燈片詳細介紹一些這方面的(現在已經過時)組:

Getting Started With Zend Framework爲V1.6

+0

需要明確要求的唯一類。如何擴展Zend_Application並重寫構造函數? – Karsten 2010-01-16 18:40:28

+0

這是可能的,但是您需要考慮應用程序對象實例上調用getAutoloader()的任何其他代碼。或者傳入與zend自動加載器100%兼容的自己的加載器對象。 – 2010-01-18 13:28:53

3

如果您使用的Zend_Application,在你的index.php,創造ZA的實例後,你可以得到/設置要ZF使用自動加載磁帶機:

$app = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/config.ini'); 
$app->getAutoloader()->setDefaultAutoloader('yourAutoloader'); 
$app->bootstrap()->run(); 

HTH

1

Zend_Loader :: registerAutoload('Zend_Loader',false);

它的框架文件http://framework.zend.com/manual/en/zend.loader.html#zend.loader.load.autoload

但是在,我不認爲你應該離開,只要啓用了Zend自動加載任何問題,因爲您使用spl_autoload_register()註冊你的自動加載回調所以它被添加到自動加載疊加。

使用spl_autoload_register,將調用所有回調以嘗試滿足請求。一旦回調成功,我不知道該鏈是否會中斷。如果確實如此,則可能通過在回調中返回true或false來控制它。

+0

記住,默認情況下,spl_autoload_register將壓入堆棧的_end_。確保你指定prepend = true或所有其他自動加載器將被稱爲_before_你。 SPL自動加載器還檢查每個調用之間是否存在class_exists(),如果找到該類,則斷開鏈。 http://php.net/manual/en/function.spl-autoload-register.php – ReactiveRaven 2011-12-08 09:35:23