Как я могу проверить, существует ли функция в стеке SPL? - PullRequest
4 голосов
/ 27 февраля 2012

Я пытаюсь использовать spl_autoload_register и хочу создать оператор if(), который будет проверять, зарегистрирован ли уже метод класса.

Например:

if (spl_autoload_function(array($this, '_loadClass'))
    // Then do nothing
else
    // Then run spl_autoload_register(array($this, '_loadClass));

Возможно ли что-то похожее на приведенный выше код / ​​метод?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2012

Я пытаюсь сделать автозагрузчик и хочу создать оператор 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' );

Тем не менее, почему вы пишете свой собственный автозагрузчик? Их уже много, трудно поверить, что ни один из них не соответствует вашим требованиям.

0 голосов
/ 27 февраля 2012

Отказ от ответственности: Я не совсем уверен, что понял ваш вопрос, но достаточно уверен, что думал, что постараюсь ответить.


Для этого нет функции 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...