簡體   English   中英

PHP命名空間:\\ My \\ Namespace或My \\ Namespace?

[英]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\\YourMOMYourMom嗎? 顯然別名勝出並解決為\\PDO ,假設沒有沖突,但它使代碼很難遵循。

編輯

可以用來證明歧義的代碼示例。 如果命名空間不合格,請確保您看到應用了全局回退

正如@netcoder所提到的,在聲明命名空間期間是不可能的。 因此, namespace Mynamespace \\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM