Php 如果存在不存在的类,为什么zend autoloader测试会导致错误?
假设我已经在配置文件中为我编写的一些类注册了额外的名称空间“Tracker_”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
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获得包含错误
希望这能帮你澄清一点