класс существует вызывает регистр автоматической загрузки spl


Я создаю простой скрипт для классов автоматической загрузки, но когда я использую 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: Foo
spl_autoload_регистр: Строка
spl_autoload_регистр: Foo\Бар

Это верно? Есть ли способ заставить "spl_autoload" игнорировать вызовы "class_exists"?

Author: Guilherme Nascimento, 2015-10-16

1 answers

Вы можете заставить class_exists не вызывать автоматическую загрузку.
Из руководства:

Bool class_ существует (строка $имя_класса [, bool$автозапуск =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>';
}

( Примечание: Похоже, это не работает в HHVM)

, Который в основном прерывает функцию, если вызывается одна из вызывающих функций class_exists, и $call['type'] не должно существовать, чтобы убедиться, что такие вызовы, как SomeClass::class_exists и $someObject->class_exists, отфильтрованы.

[ Демо-версия ]

 13
Author: Siguza, 2015-10-16 18:53:38