2016-12-30 8 views
1

Основным вариантом использования будет звонок MyEventListener::class без импорта use MyNamespace\MyEventListener. Результатом будет сломанный фрагмент кода, который относительно сложно отлаживать.Есть ли у PHP 7 способ столкнуться с несуществующим классом при использовании нотации класса MyClass :: class?

Предоставляет ли PHP 7 директиву crash вместо возврата имени класса, если класс не существует? Например:

После звонка use Foo\Bar;, Bar::class вернется 'Foo\Bar'.

Но если нет оператора импорта, PHP возвращает 'Bar', хотя класс не существует, даже в глобальном пространстве имен.

Могу ли я сделать так, чтобы он разбился?

+0

Проверьте ['Reflection' book] (http://php.net/manual/en/book.reflection.php) –

ответ

1

Насколько я знаю, вы получите хорошее сообщение об ошибке при попытке создать экземпляр класса, который не может быть найден с помощью автозагрузки или явно добавлен.

Если вы хотите проверить, если класс существует, во-первых, попробуйте следующее:

$classOutsideNamespaceExists = class_exists('Bar'); 
$classInsideNameSpaceExists = class_exists('\\Foo\\Bar')); 

Или вы могли бы попробовать этот синтаксис, так как PHP 5.5:

class_exists(MyClass::class)

Наконец, вы можете всегда используйте проверенный и проверенный метод блока try-catch.

try { 
$instanceOfMyClass = new MyClass(); 
} 
catch (Exception $e) { 
    // conclude the class does not exist and handle accordingly 
} 
0

Вещь, которую Вы должны иметь в виду, что use не «импорта» ничего. Он говорит компилятору (в случае use Foo\Bar;): когда я говорю «Бар», я имею в виду «Бар» из пространства имен Foo.

Bar::class заменяется вслепую строкой «Foo \ Bar». Он ничего не проверяет.

Пока вы не попытаетесь создать экземпляр класса, он не проверяет, существует ли он. Тем не менее, он не бросает Exception, он бросает Error:

try { 
$instanceOfMyClass = new MyClass(); 
} 
catch (Error $e) { 
    // catching an Exception will not work 
} 

Вы можете ловушку и проверить несуществующие классы во время выполнения, но пока вы не сделаете это будет счастливо бросить вокруг строки, относящуюся к классам, не существует. Это благословение в случае контейнера IoC и автозагрузчика Laravel, который злоупотребляет этим классами псевдонимов как удобными объектами верхнего уровня. Проклятие, если вы ожидали, что PHP бросит суету на ::class, не существует.