如果存在不存在的类,为什么自动装入器测试会产生错误


why does an error result from zend autoloader testing if a non-existant class exists?

假设我已经在配置文件中为我编写的一些类注册了额外的命名空间"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

我做错了什么吗?

当运行Zend Framework应用程序时,它使用spl_autoload_register (http://php.net/spl_autoload_register)注册它的自动加载器。现在,任何对class_exists的调用都将使用Zend的自动加载器(默认情况下,class_exists会尝试加载类)。

使用class_exists with Tracker_而不是Application_时出现错误的原因是因为应用程序命名空间的自动加载器由Zend_Application_Module_Autoloader (Zend_Loader_Autoloader_Resource)处理,其行为与Zend_Loader自动加载器略有不同。

Zend_Loader执行一些基本的安全检查,然后简单地尝试包含有问题的文件。资源自动加载器实际上使用了一个方法,该方法首先检查要自动加载的文件是否可读,如果不可读,则不尝试包含它。

所以你得到Tracker_错误的原因是因为在尝试自动加载时没有执行错误检查,而Application_确实有错误检查。

你也可以通过调用Zend_Loader_Autoloader::getInstance()->suppressNotFoundWarnings(true);来抑制这个,通常你不想打开这个,尽管它会在以后产生更多的混乱。

Class exists将调用自动加载器,因为如果包含类的文件还没有被包含,那么这个类不存在,所以它需要尝试先加载它,如果它没有自动加载它,那么你会从zend框架得到包含错误。

希望这能让你明白一点。

您已经告诉Zend自动加载器从该命名空间内的文件中要求任何类。

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

class_exists("Tracker_DoesNotExist", FALSE);

如果您不想从Tracker_命名空间(类前缀)自动加载类,请不要将其注册到自动加载器