2016-04-27 67 views
-1

在PHP中,似乎有以下的別名/使用類的方法,在這個例子中,一個類位於\Foo\BarPHP別名/導入:全局訪問還是別名?

// access via global namespace 
$bar = new \Foo\Bar; 

// switch into namespace (probably worst option) 
namespace Foo; 
$bar = new Bar; 

// alias namespace 
use Foo; 
$bar = new Foo\Bar; 

// alias specific class 
use Foo\Bar; 
$bar = new Bar; 

兩個最常見的選擇似乎是通過全局命名空間(第一個選項)或走樣一個特定的類(最後一個選項)的訪問。我應該什麼時候使用一個?

行業中是否有既定的最佳實踐?

回答

1

首先,我在PSR standards中沒有看到任何明確的建議。如果我在這裏遺漏了任何東西,請糾正我。這就是爲什麼我在下面寫的所有內容都是我個人的觀點,但不是一個既定的標準

二,我認爲這取決於。讓我評論每一個案例。

// switch into namespace (probably worst option) 
namespace Foo; 
$bar = new Bar; 

我看不出有什麼理由試圖做到這一點,很可能這是行不通的。至少您不能在同一個文件中多次切換命名空間。檢查PHP文檔中的Defining namespaces部分。

含有一個命名空間必須在 之前的任何其他代碼的文件頂部聲明命名空間文件 - 有一個例外:在declare 關鍵字。

// access via global namespace 
$bar = new \Foo\Bar; 

爲什麼不呢?例如,您可能會寫入\PDOException\stdClass,並且不會導入它。我個人總是從全局命名空間導入類,但這只是我的愛好。我做而不是看到其他人做同樣的任何理由,我看到了很多來自全局名稱空間的類未導入的例子。

// alias namespace 
use Foo; 
$bar = new Foo\Bar; 

當您需要來自其他命名空間的許多類時,這不是一個壞主意。當您爲註釋導入Doctrine\ORM\Mapping時的常見示例。檢查在Symfony Doctrine tutorial

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

一個例子這清楚地表明,Column類屬於Doctrine\ORM\Mapping命名空間。你並不需要導入所有的類,我認爲它甚至看起來更好,而不是當你寫

/** 
* @Column(type="integer") 
* @Id 
* @GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

因爲它允許組的註釋和說明,這些註解是ORM,因爲你可能會,如果您有其他註釋將。

// alias specific class 
use Foo\Bar; 
$bar = new Bar; 

我認爲這是最常見的情況,當你需要命名空間的幾個類並多次使用它們。因此,如果您使用名稱空間替換名稱而不是名稱,它可能會提高可讀性。您可能會使用set alias作爲導入類,以提高可讀性並避免衝突。