2016-12-06 32 views
0

我是PHP新手。我只是想了解PHP命名空間,並堅持要改變類名稱,我指的是這篇文章標題爲How to use PHP namespace。並在該頁面上引用下面的代碼。在PHP中將類名命名爲MyClass和名稱空間 Myclass有什麼區別?

<?php 
namespace App\Lib1; 

class MyClass { 
    public function WhoAmI() { 
     return __METHOD__; 
    } 
} 

$c = __NAMESPACE__ . '\\MyClass'; 
$m = new $c; 
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI 
?> 

在上面的代碼,我想,他們已經創建的對象等,

$c = __NAMESPACE__ . '\\MyClass'; 
$m = new $c; 

我想對象可以被創建在上述情況下那樣簡單,

$m = new MyClass(); 

而關於在其他代碼中已使用代碼創建對象,

$m = new namespace\MyClass; 

現在,如果我比較以上所有三種,我找到兩種創建類名稱1的方法。$m = new MyClass();和2. $m = namespace\MyClass;。我想知道使用$m = namespace\MyClass;有何區別和目的?非常感謝提前。

回答

1

在PHP中使用名稱空間的最大優點是當您有多個具有相同名稱的類時。沒有名稱空間,開發人員需要擔心通過創建類MyClass,還有數千個其他第三方庫也可能具有MyClass。

假設您想創建一個名爲DateTime的類。如果您只是在沒有命名空間的情況下編寫該函數,則會與PHP的DateTime類發生衝突。通過聲明一個命名空間,你可以對代碼進行分類。

<?php 

$myObject = DateTime(); // This statement creates an object using PHP's implementation of DateTime 

namespace Foo\DateTime; 
use Foo\DateTime as DateTime; 

$myObject = DateTime(); // This statement will use the custom class from the Foo\DateTime namespace 

$myObject = PHP\DateTime(); // This statement will use PHP's class even though you're using the Foo\DateTime namespace 

?> 

第二個優點是代碼簡潔。如果您使用上面顯示的Foo \ DateTime命名空間,則在您從類中創建自定義對象時,不必使用完全限定名稱。當您必須創建大量的自定義類的實例時,這非常有用。

當您使用像這樣的命名空間,你可以把它寫成一個別名,而不是一個完全合格的名稱:

use Foo\DateTime as DateTime; 
$myObject = new DateTime(); 

不使用命名空間,你需要創建對象,像這樣,如果你想使用您的DateTime類,而不是PHP的DateTime類:

$myObject = Foo\DateTime(); 
1

我想有間沒有任何本質上的區別:

$m = new MyClass();$m = new namespace\MyClass;

它可以幫助你明確地說明兩個類具有相同名稱的一個你使用的:

<?php 
namespace Foo; 

class MyClass { 
    public function WhoAmI() { 
     return __METHOD__; 
    } 
} 
?> 

<?php 
namespace Bar; 

class MyClass { 
    public function WhoAmI() { 
     return __METHOD__; 
    } 
} 
?> 

<?php 
namespace Bar; 
use Foo; 

$obj1 = new MyClass; 
var_dump($obj1->WhoAmI()); //Bar\MyClass::WhoAmI 

$obj2 = new namespace\MyClass; 
var_dump($obj2->WhoAmI()); //Bar\MyClass::WhoAmI 

$obj3 = new Foo\MyClass; 
var_dump($obj3->WhoAmI()); //Foo\MyClass::WhoAmI 

我認爲在這種情況下最好使用aliasing

+0

是的,這是真的,都被賦予了相同的輸出。感謝您的鏈接,我指的是鏈接,並試圖瞭解整個系統,將發佈後評論。謝謝 – codenext

相關問題