Как проверить, существует ли класс в пространстве имен?

У меня есть это:

use XXX\Driver\Driver; ... var_dump(class_exists('Driver')); // false $driver = new Driver(); // prints 123123123 since I put an echo in the constructor of this class exit; 

Ну … это поведение довольно иррационально (создание объектов классов, которые по PHP не существуют). Есть ли способ проверить, существует ли класс в данном пространстве имен?

Solutions Collecting From Web of "Как проверить, существует ли класс в пространстве имен?"

Чтобы проверить класс, вы должны указать его с пространством имен, полным путем:

 namespace Foo; class Bar { } 

а также

 var_dump(class_exists('Bar'), class_exists('\\Foo\\Bar')); //false, true 

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

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

 namespace Foo; class Bar { public static function baz() {} } use Foo\Bar; var_dump(class_exists('Bar')); //false var_dump(method_exists('Bar', 'baz')); //false $ref = "Bar"; $obj = new $ref(); //fatal 

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

 var_dump(class_exists('\Foo\Bar')); //true var_dump(method_exists('\Foo\Bar', 'baz')); //true $ref = 'Foo\Bar'; $obj = new $ref(); //ok 

Проблема (как упоминается в class_exists() странице руководства пользователя class_exists() ) заключается в том, что псевдонимы не учитываются, когда имя класса указывается в виде строки. Это также влияет на другие функции, которые принимают имя класса, например is_a() . Следовательно, если вы укажете имя класса в строке, вы должны указать полное пространство имен (например, '\XXX\Driver\Driver' , 'XXX\\Driver\\Driver' ).

PHP 5.5 вводил константу class только для этой цели:

 use XXX\Driver\Driver; ... if (class_exists(Driver::class)) { ... }