2015-10-16 132 views
3

我创建的自动加载类的简单脚本,但是当我使用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:富
spl_autoload_register: Bar
spl_autoload_register:Foo \ Bar

是吗?有没有办法让“spl_autoload”忽略调用“class_exists”?

+3

你有一个关于'class_exists'问题,为什么你不抬头看手册吧? – Rizier123

+1

@ Rizier123感谢*阻止*。 –

+0

我的评论不应该阻止你。如果您对特定功能有疑问或问题,应该多提一些提醒/信息来检查手册。 – Rizier123

回答

8

您可以使class_exists不会调用自动加载。
the manual

布尔class_exists(字符串$ CLASS_NAME [,布尔$自动加载=真]

所以一个电话,如:

class_exists('Foo', false);

会忽略自动加载。

[Demo]

可能使自动加载功能忽略使用debug_backtrace由(AB)从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]

+0

'debug_backtrace'的好例子:)谢谢 - 但'class_exists(...,false);'这就够了。不过这是一个很好的例子。谢谢你的鼓励,并提供一个很好的答案,不像其他用户。 –