2013-03-06 93 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