2013-03-06 94 views
3

我对命名空间很陌生(是的,我已阅读PHP文档命名空间部分)。我想知道命名空间的范围与多个文件有关。当我在包含全局代码的文件中包含或要求该文件时,命名空间是否超出一个文件有效?此外,这是如何影响全球代码?我会被迫用全局代码改变任何语法。多文件和命名空间范围

例如,假设我有文件A.php。我希望能有是这样的:

namespace A; 
class Abc { ... } 

然后让我们说我有全局代码一些文件,称它为main.php:

include("A.php"); 
class Abc { ... } 
$abc = new Abc(); // Should be global Abc, right? 
$abcFromNameSpace = new A\Abc(); // Should be namespace Abc, right? 
... 

作为后续问题,我也想知道,如果我将包含名称空间的文件包含在具有名称空间的另一个文件中,会发生什么情况,而不是上面的例子,其中main.php只包含全局代码。请问像这样的工作:

namespace A; 
class Abc { ... } 

然后让我们说我有全局代码一些文件,称它为B.php:

namespace B; 
include("A.php"); 
class Abc { ... } 
$abc = new B\Abc(); // Should be namepsace B Abc, right? 
$abcFromNameSpace = new A\Abc(); // Should be namespace A Abc, right? 

回答

4

你是指一类的任何时间是外当前文件或类的范围内,你使用它的命名空间:

<?php 
namespace B; 

$class = new \A\Abc(); 

但是,如果你在你的脚本“使用”的命名空间,你可以让它出来:”

<?php 
namespace B; 

use A\Abc; 

$class = new Abc(); 
+0

只是为了澄清,所以名称空间的范围仅限于文件?在全局例子(第一个例子)的情况下,在main.php中,如果我做$ class = new Abc();那么我指的是全球班。如果我想引用命名空间A的Abc类,我必须做$ class = new \ A \ Abc();是? – 2013-03-06 05:57:54

+0

正确。如果您没有在文件顶部定义名称空间,则会在全局范围内查找类名称。否则,只会在文件命名空间中查找'Abc()'(除非预先加上反斜杠来声明全局命名空间)。 – 2013-03-06 06:01:29

+1

我明白了。但是,对我而言,这似乎有点奇怪,即命名空间的作用域并不超出它们在另一个文件中包含该文件时定义的文件。我的意思是,所有其他代码都成为包含在include语句所在行的文件的一部分。 – 2013-03-06 20:45:26