3

假设我已经在配置文件中为我编写的一些类注册了额外的命名空间“Tracker_”,使用

autoloadernamespaces[]="Tracker_"

除了我在测试错误处理时,这个命名空间和自动加载器的东西按预期工作。当我测试一个不存在的类是否存在时,使用

class_exists("Tracker_DoesNotExist");

它抛出一个异常

include_once(Tracker/DoesNotExist.php): failed to open stream: No such file or directory
/path/Zend/Loader.php:146
/path/Zend/Loader.php:146
/path/Zend/Loader.php:94
/path/Zend/Loader/Autoloader.php:479
/path/Zend/Loader/Autoloader.php:124
/other/path/TrackablesMapper.php:40 //line referenced above

同时,相同的 class_exists 函数适用于我测试过的所有其他案例,即

class_exists("Application_ExistingClass"); //returns true
class_exists("Application_NonExistingClass"); //returns false
class_exists("Tracker_ExistingClass"); //returns true

难道我做错了什么?

4

2 回答 2

6

When running a Zend Framework application, it registers its autoloader using spl_autoload_register (http://php.net/spl_autoload_register). Now any calls to class_exists will use Zend's autoloader (by default class_exists tries to load the class).

The reason you are getting the error when using class_exists with Tracker_ and not Application_ is because the Application namespace's autoloader is handled by Zend_Application_Module_Autoloader (Zend_Loader_Autoloader_Resource) which acts slightly different than the Zend_Loader autoloader.

Zend_Loader performs some basic security checks and then simply tries to include the file in question. The resource autoloader actually uses a method that first checks to see if the file to be autoloaded is readable and if it is not, then it does not try to include it.

So the reason you are getting the error with Tracker_ is because no error checking is performed when trying to autoload, and Application_ does have error checking.

You can also suppress this by calling Zend_Loader_Autoloader::getInstance()->suppressNotFoundWarnings(true); Usually you don't want to turn this on though as it can create more confusion later.

Class exists will call the autoloader because if the file containing the class has not yet been included, then the class does not exist, so it needs to attempt to try to load it first, if it fails to autoload it, then you get the include error from zend framework.

Hope that cleared it up a bit for you.

于 2011-09-22T00:18:36.793 回答
2

您已经告诉 Zend 自动加载器需要来自该名称空间内的文件的任何类。

class_exists()Docs触发自动加载器。如果您想阻止这种情况,请添加另一个参数:

class_exists("Tracker_DoesNotExist", FALSE);

If you don't want to autoload classes from the Tracker_ namespace (class prefix), don't register it with the autoloader.

于 2011-09-22T00:05:17.897 回答