我发现当Zend尝试自动加载不存在的文件时,会抛出一个我无法在try / catch块中捕获的错误。当我使用class_exists
时也会发生这种情况。我通过黑客攻击解决了这个问题:
if ($once) {
if (!@include_once ($filename)) {
throw new Exception("Failed to include $filename");
}
// include_once $filename;
}
else {
if (!@include ($filename)) {
throw new Exception("Failed to include $filename");
}
// include $filename;
}
注释掉的行是zend的原作。现在我可以捕获无法包含文件时抛出的异常。任何人都可以提出一个更简洁的方法来做这个不涉及黑客攻击的事情吗?
我在Zend版本1.11.10上,有问题的代码是Zend_Loader第146行。
感谢。
答案 0 :(得分:1)
而不是使用include或include_once尝试使用Zend_Loader::loadClass()
以下是API:Zend_Loader::loadClass($class, $dirs)
一个例子:
Zend_Loader::loadClass('Container_Tree',
array(
'/home/production/mylib',
'/home/production/myapp'
)
);
现在关于它是如何工作的模糊:
指定类的字符串将转换为相对路径 用您的操作系统替换带有目录分隔符的下划线,以及 附加'。php'。在上面的示例中,*'Container_Tree'*变为 Windows上的'Container \ Tree.php'。
如果 $ dirs 是字符串或数组,* Zend_Loader :: loadClass()*搜索 提供的顺序中的目录。第一个匹配的文件是 加载。如果指定的 $ dirs 中不存在该文件,那么 搜索PHP环境的include_path。
如果找不到文件或加载后该类不存在, * Zend_Loader :: loadClass()*抛出 Zend_Exception 。
这应该允许您对任何不存在的类使用try / catch块。 Zend_Loader :: loadFile()也有类似的功能。
答案 1 :(得分:0)
不要尝试自动加载不存在的类。如果由于某种原因,您尝试自动加载的课程可能会或可能不会在那里,请使用class_exists()
电话打包该部分代码。
我想不出为什么你会希望class_exists()
在失败时抛出异常,因为它的唯一目的是让你检查是否存在类。