假设我已经在配置文件中为我编写的一些类注册了额外的命名空间"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_
命名空间(类前缀)自动加载类,请不要将其注册到自动加载器