Php 如果存在不存在的类,为什么zend autoloader测试会导致错误?

Php 如果存在不存在的类,为什么zend autoloader测试会导致错误?,php,zend-framework,namespaces,zend-autoloader,Php,Zend Framework,Namespaces,Zend Autoloader,假设我已经在配置文件中为我编写的一些类注册了额外的名称空间“Tracker_” autoloadernamespaces[]="Tracker_" 除了在测试错误处理时,这个名称空间和自动加载器的工作和预期的一样。当我测试一个不存在的类是否存在时,使用 class_exists("Tracker_DoesNotExist"); 它抛出一个异常 include_once(Tracker/DoesNotExist.php): failed to open stream: No such file

假设我已经在配置文件中为我编写的一些类注册了额外的名称空间“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("Application_ExistingClass"); //returns true
class_exists("Application_NonExistingClass"); //returns false
class_exists("Tracker_ExistingClass"); //returns true

我做错什么了吗

您已经告诉Zend autoloader需要该名称空间内文件中的任何类

触发自动加载器。如果要防止出现这种情况,请添加另一个参数:

class_exists("Tracker_DoesNotExist", FALSE);

如果您不想从
跟踪器
命名空间(类前缀)自动加载类,请不要向自动加载程序注册它。

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

使用class_时出现错误的原因是
Tracker\uu
存在,而不是
Application\uu
,因为应用程序命名空间的自动加载程序由
Zend_Application\u模块自动加载程序
处理(Zend_Loader\u autoloader\u资源)其作用与Zend_加载器的作用稍有不同

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

因此,
Tracker\uu
出现错误的原因是,在尝试自动加载时没有执行错误检查,
Application\u
确实进行了错误检查

您还可以通过调用
Zend\u Loader\u Autoloader::getInstance()->suppressNotFoundWarnings(true)来禁止此操作通常你不想打开它,因为它会在以后造成更多的混乱

类exists将调用自动加载程序,因为如果包含该类的文件尚未包含,则该类不存在,因此它需要首先尝试加载该类,如果它无法自动加载,则会从zend framework获得包含错误

希望这能帮你澄清一点