2009-08-10 76 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 2009-08-10 20:08:09

2

也许我没有很好地理解你的问题;在这种情况下,你能否提供一个你得到什么样的例子,以及你期望的?


您确定它会尝试在foo名称空间中加载myfile.php中的函数吗?

考虑到我有一个文件(临时-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) 

这似乎表明第二个函数不在任何名称空间内,除了全局名称空间外 - 这与其未在任何名称空间中声明的事实相对应。

如果我没有记错的话,“命名空间”指令只对其使用的文件有效,而不适用于包含的文件。


namespaces FAQImport names cannot conflict with classes defined in the same file页面似乎表明这一点。


希望这有助于我理解正确的问题...


编辑:顺便说一句,交换的顺序行,像这样:

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

止跌” t工作:“命名空间”指令必须是文件的第一个:如果您这样做,您将收到致命错误:

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'声明只适用于它们自己的文件。 – 2009-08-10 18:46:56

0

我只想在我的研究结果中对此进行报告。由于PHP不能__toString方法处理异常,解决的办法是自己做:沿着

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

线的东西不过什么变得很古怪,调用error::_getExceptionPage($e)的命名空间变成一样的类中__toString已被定义 - 除了在我的异常处理代码中加上前缀\之前,我无法找到解决方法,即每个呼叫​​中的任何类都必须变为\someClass::staticMethod()

同样适用于包含文件,所有内容 - 自抛出的异常变为嵌入错误类的命名空间以来的所有代码。使用PHP 5.3.17测试