2009-08-10 78 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測試