如何「重置」命名空間到全局?考慮下面的代碼:在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