我正在尝试使用spl_autoload_register
并且我想创建一个if()
语句来检查类方法是否已经注册。
例如:
if (spl_autoload_function(array($this, '_loadClass'))
// Then do nothing
else
// Then run spl_autoload_register(array($this, '_loadClass));
像上面的代码/方法可能吗?
我正在尝试使用spl_autoload_register
并且我想创建一个if()
语句来检查类方法是否已经注册。
例如:
if (spl_autoload_function(array($this, '_loadClass'))
// Then do nothing
else
// Then run spl_autoload_register(array($this, '_loadClass));
像上面的代码/方法可能吗?
我正在尝试做一个自动加载器,我想创建一个 if 语句来检查类方法是否已经注册。
你不应该。不需要做if语句;spl_autoload_register
将忽略具有相同参数的第二次调用:
<?php
$foo = function( $class ) {
return false;
};
spl_autoload_register( $foo );
var_dump( spl_autoload_functions( ) );
spl_autoload_register( $foo );
var_dump( spl_autoload_functions( ) );
输出显示虽然我们调用spl_autoload_register
了两次,但仍然只有一个自动加载器;
array(1) {
[0]=>
object(Closure)#1 (1) {
["parameter"]=>
array(1) {
["$class"]=>
string(10) "<required>"
}
}
}
array(1) {
[0]=>
object(Closure)#1 (1) {
["parameter"]=>
array(1) {
["$class"]=>
string(10) "<required>"
}
}
}
如果你想确保一个类不会注册自己两次,你当然可以在某种静态成员中设置它;
<?php
class Foo {
protected static $registered = false;
public function register( ) {
if( self::$registered !== false ) {
return;
}
echo "spl_autoload_register( \$this, '_loadClass' );\n";
self::$registered = true;
}
}
$foo = new Foo( );
$foo->register( );
$bar = new Foo( );
$bar->register( );
输出显然是一行:
spl_autoload_register( $this, '_loadClass' );
也就是说,你为什么要编写自己的自动加载器?已经有很多,很难相信它们都不符合您的要求。
免责声明:我不完全相信我理解你的问题,但我有足够的信心我想我会尝试回答。
没有spl_*
功能可以做到这一点。您得到的最接近的是spl_autoload_functions()
返回 spl 用来加载的函数,而不是正在加载的函数。
解决方案:
编写您自己的加载器,记录加载函数/类的时间并将其注册到spl_autoload_register
.
回答评论:如果你有一个加载函数的类,让它附加到它已经加载的类的内部数组中。
class Autoloader {
protected $loaded = array();
function autoload($class) {
// find class location
// if it is found:
// include class
$this->loaded[] = $class;
}
function hasLoaded($class) {
return in_array($class, $this->loaded);
}
}
$autoloader = new Autoloader();
spl_autoload_register(array($autloader, 'autoload'));
如果您不想知道它是否由自动加载器加载,您可以简单地使用class_exists
.