2010-01-08 29 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