Сброс пространства имен в PHP?

Как я могу «переустановить» пространство имен на глобальное? Учитывая следующий код:

namespace foo; include 'myfile.php'; 

Теперь myfile.php попытается загрузить все его классы в пространство имен foo, хотя его классы находятся в глобальном пространстве имен. Теперь было бы неважно поменять порядок этих строк, но как я могу справиться с myfile.php с автозагрузчиком? Он попытается загрузить классы в пространстве имен foo.

Related of "Сброс пространства имен в PHP?"

Пространства имен работают для каждого файла . Если myfile.php не объявляет какое-либо пространство имен, тогда все в нем будет принадлежать глобальному пространству имен, независимо от пространства имен, в котором было использовано include .

Короче говоря, объявления namespace относятся только к их собственному файлу, а не к ним.

myfile.php должен объявить пространство имён, в котором оно хочет находиться. Если вы хотите, чтобы myfile.php загружался в глобальное пространство имен, я считаю, что вы можете

 namespace // empty namespace means global { } 

вокруг тела myfile.php. Убедитесь, что вы используете фигурные скобки, иначе вы переопределите остальную часть файла, в который myfile.php включен, также в глобальное пространство имен.

Может, я плохо понял ваш вопрос; В этом случае вы могли бы привести пример того, что вы получаете, и чего вы ожидаете?

Вы уверены, что он попытается загрузить функции из myfile.php в пространстве имен foo ?

Учитывая, что у меня есть один файл (temp-2.php), который выглядит так:

 <?php namespace foo; function my_function_this_file() { var_dump(__FUNCTION__); } my_function_this_file(); include 'my_other_file.php'; my_function_the_other_file(); 

И еще один (my_other_file.php), который выглядит так:

 <?php function my_function_the_other_file() { var_dump(__FUNCTION__); } 

Когда я вызываю первый из своего браузера, я получаю этот вывод:

 string 'foo\my_function_this_file' (length=25) string 'my_function_the_other_file' (length=26) 

Это, по-видимому, указывает на то, что вторая функция не находится внутри какого-либо пространства имен, кроме глобального, что соответствует тому, что он не объявлен ни в одном пространстве имен.

Если я правильно помню, команда «namespace» действительна только для файла, в котором он используется, а не для включенных файлов.

Имена импорта не могут конфликтовать с классами, определенными на одной и той же странице файла, из часто задаваемых номеров имен .

Надеюсь, это поможет, и я правильно понял вопрос …


EDIT: btw, заменяя порядок строк, например:

 <?php include 'my_other_file.php'; namespace foo; 

Не работает: команда «namespace» должна быть первой из файлов: вы получите Fatal Error, если вы это сделаете:

 Fatal error: Namespace declaration statement has to be the very first statement in the script 

Я бы просто хотел услышать это с моими выводами. Поскольку PHP не может обрабатывать исключения в методах __toString, решение должно сделать это самостоятельно: что-то вроде строк

 public function __toString() { try { return $this->draw(); } catch ( \Exception $e ) { die( \error::_getExceptionPage( $e ) ); } } 

Однако то, что становится действительно странным, пространство имен вызова error::_getExceptionPage($e) становится таким же, как класс, в котором был определен __toString и мне не удалось найти способ обойти это, кроме префикса всего в моем исключении обработка кода с \ , т. е. каждый вызов любого класса в getExceptionPage должен стать \someClass::staticMethod() .

То же самое касается включенных файлов, всего – всего кода, поскольку введенное исключение встраивается в пространство имен неисправного класса. Протестировано с помощью PHP 5.3.17