Gui*_*nto 3 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');
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其过滤掉.
[ 演示 ]
| 归档时间: |
|
| 查看次数: |
1603 次 |
| 最近记录: |