[英]PHP namespaces : \My\Namespace or My\Namespace?
My\\Namespace
\\My\\Namespace
那么,我應該使用哪一個,我看到php文檔主要使用My\\Namespace
。
但據說\\My\\Namespace
更好,因為非模糊,而My\\Namespace
可以解析為\\RandomNamespace\\My\\Namespace
。
在閱讀了Doctrine 2中有一個問題后,我開始懷疑這個問題 :“ 請在代碼和文檔中用'\\ Doctrine \\ XXX \\ YYY'替換'Doctrine \\ XXX \\ YYY' ”
那么,你有關於此的更多信息嗎? 謝謝
這與使用相對vs絕對文件/ uri路徑沒有什么不同,並且將歸結為首選項。 但是,與絕對路徑不同,我同意不太模糊的\\My\\Namespace
因為它永遠不會破壞,相對命名空間可以。
命名空間別名,通過use
添加相對命名空間名稱的含義。 例如,我可以說: use \\PDO as YourMom
,然后在代碼中調用YourMom
。 它被稱為\\PDO
, \\YourMOM
或YourMom
嗎? 顯然別名勝出並解決為\\PDO
,假設沒有沖突,但它使代碼很難遵循。
編輯
可以用來證明歧義的代碼示例。 如果命名空間不合格,請確保您看到應用了全局回退 。
正如@netcoder所提到的,在聲明命名空間期間是不可能的。 因此, namespace My
和namespace \\My
(或交換下面的任何其他名稱空間聲明)100%完全相同,並且聲明完全限定名稱空間。
namespace My
{
}
namespace My\Other
{
use Bob; // Resolves to \My\Other\Bob
}
namespace My\Other\NS
{
use \My\Other as Other;
use Other\NS as Duh; // This resolves to \My\Other\NS
}
namespace My\Other\Bob
{
use Other\NS as Duh; // This resolves to \Other\NS becuase the namespace doesn't exist inside \My\Other\Bob
}
在命名空間聲明本身,它沒有任何區別。 此聲明始終定義完整限定名稱,因此您可以安全地省略前導命名空間分隔符。 對於use
語句也是如此。
namespace My\Namespace;
// Is exactly the same as
namespace \My\Namespace;
use Foo\Bar as Class1;
// Is exactly the same as
use \Foo\Bar as Class2;
在所有其他情況下,前導分隔符確保給定的限定符是絕對值,如果它缺失,則為相對值。 請參閱手冊 ,了解它們的解決方法。
如果您只使用來自同一名稱空間的類和/或通過use
(也許as
)“聲明”文件頂部的每個類,您可以安全地使用相對類標識符。
實際上有區別,但並不總是(啊對)。
在use
構造中,您永遠不必“提及”前導\\
。 如果類在同一名稱空間中,或者如果您正在使用導入( use ns
導入),則內聯您永遠不會。
但有時你必須:
namespace foo;
class bar extends \baz\Bar {
您正在使用未定義/未知/未排序的內聯類,因此您必須提及其來源。
另一個例子是命名空間中使用的unnamespaced類,內聯:
namespace foo;
$dt = new \DateTime;
最佳實踐(通常)是導入當前文件所需的所有類。 使用聲明非常,非常,非常便宜,所以不要拖延。
namespace foo;
use baz\Bar AS OtherBar;
use \DateTime;
class Bar extends OtherBar { // or something like that; in this case (same class name) it's tricky
function __construct() {
$dt = new DateTime;
編輯1
此外,即使您可能位於正確的命名空間中,也不要忘記在將它們作為字符串傳遞時使用完全命名空間的類名:
namespace foo;
$class = 'foo\bar';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.