2009-08-10 4 views
6

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

namespace foo; 
include 'myfile.php'; 

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

ответ

10

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

Длинный рассказ, namespace объявления применяются только к их собственному файлу, а не к нему.

+0

http://us2.php.net/manual/en/language.namespaces.basics.php Примеры на странице для примера. – koen

2

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


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

Учитывая У меня есть один файл (темп-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» действительна только для файла, в котором он используется, а не для включенных файлов.


Import names cannot conflict with classes defined in the same file страница из namespaces FAQ, кажется, указывает, что тоже.


Надеюсь, что это помогает, и я понял вопрос правильно ...


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

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

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

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

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

namespace // empty namespace means global 
{ 
} 

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

+3

Вам не нужно это пустое объявление пространства имен. Он будет * не * влиять на файлы, которые его включали, поскольку объявления «namespace» применяются только к их собственному файлу. –

0

Я бы просто хотел услышать это с моими выводами. Поскольку 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

Смежные вопросы