Я пытаюсь сделать автозагрузчик и хочу создать оператор 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' );
Тем не менее, почему вы пишете свой собственный автозагрузчик? Их уже много, трудно поверить, что ни один из них не соответствует вашим требованиям.