php – class_exists正在调用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和$someObject-> class_exists这样的调用.
[Demo]
标签:php,spl,autoloader,spl-autoload-register 来源: https://codeday.me/bug/20190714/1458803.html