class_exists 正在呼叫 spl_autoload_register
class_exists is calling spl_autoload_register
我为自动加载 类 创建了一个简单的脚本,但是当我使用 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: Bar
spl_autoload_register: Foo\Bar
是吗?有没有办法让 "spl_autoload" 忽略调用 "class_exists"?
你可以让class_exists
不调用自动加载。
来自 the manual:
bool class_exists ( string $class_name [, bool $autoload = true ] )
这样的电话:
class_exists('Foo', false);
将忽略自动加载。
[Demo]
也可能通过(ab)使用debug_backtrace
使自动加载函数忽略来自class_exists
的调用,但这种方法很丑陋而且确实慢,但为了完整起见,这里是如何做到的:
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
和 [=17= 这样的调用] 被过滤掉了。
[Demo]
我为自动加载 类 创建了一个简单的脚本,但是当我使用 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: Bar
spl_autoload_register: Foo\Bar
是吗?有没有办法让 "spl_autoload" 忽略调用 "class_exists"?
你可以让class_exists
不调用自动加载。
来自 the manual:
bool class_exists ( string $class_name [, bool $autoload = true ] )
这样的电话:
class_exists('Foo', false);
将忽略自动加载。
[Demo]
也可能通过(ab)使用debug_backtrace
使自动加载函数忽略来自class_exists
的调用,但这种方法很丑陋而且确实慢,但为了完整起见,这里是如何做到的:
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
和 [=17= 这样的调用] 被过滤掉了。
[Demo]