如何“重置”命名空间到全局?考虑下面的代码:在PHP中重置命名空间?
namespace foo;
include 'myfile.php';
myfile.php现在将尝试加载所有类的foo的命名空间,即使它的类都在全局命名空间。现在交换这些行的顺序并不是什么大问题,但我如何处理myfile.php中的自动加载器?它会尝试加载名称空间foo中的类。
如何“重置”命名空间到全局?考虑下面的代码:在PHP中重置命名空间?
namespace foo;
include 'myfile.php';
myfile.php现在将尝试加载所有类的foo的命名空间,即使它的类都在全局命名空间。现在交换这些行的顺序并不是什么大问题,但我如何处理myfile.php中的自动加载器?它会尝试加载名称空间foo中的类。
命名空间在每个文件的基础上工作。如果myfile。php不声明任何名称空间,那么它的所有内容都将属于全局名称空间,而不管使用include
的名称空间如何。
长话短说,namespace
声明只适用于自己的文件,不包括。
也许我没有很好地理解你的问题;在这种情况下,你能否提供一个你得到什么样的例子,以及你期望的?
您确定它会尝试在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 FAQ的Import 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
myfile.php应该宣布,它希望在命名空间。如果你想确保全球命名空间myfile.php负载,我相信你可以把
namespace // empty namespace means global
{
}
周围MYFILE的身体。 PHP。确保使用大括号,否则您将重新定义其中包含myfile.php的文件的其余部分,以使其也位于全局名称空间中。
您不需要那个空的名称空间声明。它不会影响包含它的文件,因为'namespace'声明只适用于它们自己的文件。 – 2009-08-10 18:46:56
我只想在我的研究结果中对此进行报告。由于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测试
http://us2.php.net/manual/en/language.namespaces.basics.php 页面上的示例为此示例。 – koen 2009-08-10 20:08:09