我为自动加载类创建了一个简单的脚本,但是当我使用class_exists
执行spl_autoload_register
时,例如:
<?php
function autoLoadClass($name) {
echo 'spl_autoload_register: ', $name, '<br>';
}
spl_autoload_register('autoLoadClass');
class_exists('Foo');
class_exists('Bar');
class_exists('Foo\\Bar');
输出:
spl_autoload_register:Foo
spl_autoload_register:酒吧
spl_autoload_register:Foo \ Bar
是吗?有没有办法制作&#34; spl_autoload&#34;忽略调用&#34; class_exists&#34;?
答案 0 :(得分:13)
您可以class_exists
不调用自动加载
来自the manual:
bool class_exists(string $ class_name [,bool $ autoload = true] )
这样的电话如下:
class_exists('Foo', false);
会忽略自动加载。
[Demo]
可能使自动加载功能忽略来自class_exists
的调用(ab)使用debug_backtrace
,但该方法很丑陋而且非常慢,但对于为了完整起见,这里有如何做到这一点:
function autoLoadClass($name) {
foreach(debug_backtrace() as $call) {
if(!array_key_exists('type', $call) && $call['function'] == 'class_exists') {
return;
}
}
echo 'spl_autoload_register: ', $name, '<br>';
}
(注意:这似乎不适用于HHVM)
如果其中一个调用函数被调用class_exists
,那么基本上会中止该函数,并且$call['type']
必须不存在以确保SomeClass::class_exists
和$someObject->class_exists
之类的调用是过滤掉了。
[Demo]