class_exists正在调用spl_autoload_register

时间:2015-10-16 18:36:54

标签: php spl autoloader 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:酒吧
  spl_autoload_register:Foo \ Bar

是吗?有没有办法制作&#34; spl_autoload&#34;忽略调用&#34; class_exists&#34;?

1 个答案:

答案 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]