Как я могу «переустановить» пространство имен на глобальное? Учитывая следующий код:
namespace foo; include 'myfile.php';
Теперь myfile.php попытается загрузить все его классы в пространство имен foo, хотя его классы находятся в глобальном пространстве имен. Теперь было бы неважно поменять порядок этих строк, но как я могу справиться с myfile.php с автозагрузчиком? Он попытается загрузить классы в пространстве имен foo.
Пространства имен работают для каждого файла . Если 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