class_exists正在调用spl_autoload_register

Gui*_*nto 3 php spl autoloader spl-autoload-register

我创建的自动加载类的简单脚本,但是当我使用class_existsspl_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');
Run Code Online (Sandbox Code Playgroud)

输出:

spl_autoload_register:Foo
spl_autoload_register:Bar
spl_autoload_register:Foo\Bar

是对的吗?有没有办法让"spl_autoload"忽略调用"class_exists"?

Sig*_*uza 12

你可以class_exists不打电话自动加载.
手册:

bool class_exists(string $ class_name [,bool $ autoload = true])

所以像这样的电话:

class_exists('Foo', false);

会忽略自动加载.

[ 演示 ]

可以使自动加载功能忽略来自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>';
}
Run Code Online (Sandbox Code Playgroud)

(注意:这似乎不适用于HHVM)

如果调用其中一个调用函数class_exists,那基本上会中止该函数,并且$call['type']必须不存在以确保调用类似的函数SomeClass::class_exists并将$someObject->class_exists其过滤掉.

[ 演示 ]