класс существует вызывает регистр автоматической загрузки 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"?
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
, отфильтрованы.
[ Демо-версия ]