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

标签 php zend-framework namespaces zend-autoloader

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

autoloadernamespaces[]="Tracker_"

具有此 namespace 和自动加载器的东西按预期工作,除非我正在测试错误处理。当我测试一个不存在的类是否存在时,使用

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 与 Tracker_ 而不是 Application_ 一起使用时出现错误的原因是因为 Application 命名空间的自动加载器由 Zend_Application_Module_Autoloader 处理( Zend_Loader_Autoloader_Resource) 其行为与 Zend_Loader 自动加载器略有不同。

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

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

您也可以通过调用 Zend_Loader_Autoloader::getInstance()->suppressNotFoundWarnings(true); 来抑制它,但通常您不想打开它,因为它会在以后造成更多困惑。

Class exists会调用autoloader,因为如果包含该class的文件还没有被include,那么这个class就不存在,所以需要先尝试加载它,如果自动加载失败,那么你从 zend 框架获取包含错误。

希望这对您有所帮助。

关于php - 如果存在不存在的类,为什么 zend autoloader 测试会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7507963/

相关文章:

javascript - 从 HTML/JS 更改 PDF 中的数据

php - Mysql - 查找重复值然后只返回最新的值然后如果它返回某个结果则忽略它

javascript - 在命名空间中混合 javascript 和 jquery

visual-studio-2010 - 为什么命名空间在 Visual Studio 2010 中起作用?

namespaces - JSON-LD 上下文中的不同值前缀

php - 如何从 Action 中在后台正确运行 Symfony 任务?

php - 表连接 SQL/PHP (CRUD)

php - Zend form_element 添加带有自定义错误消息的验证器

zend-framework - 为 Zend 中的电子邮件字段设置单个错误消息

php - 如何在 ZF2 中将列添加到 select 语句?