2016-12-06 5 views
0

私はPHPを初めて使用しています。私はちょうどPHPの名前空間を理解しようとしており、クラス名を変更する次のポイントに固執しようとしています。私はHow to use PHP namespaceというタイトルのこの記事を参照しています。そしてそのページの次のコードを参照していました。私は、オブジェクトを推測クラス名をMyClassとして、名前空間 MyclassをPHPで命名することとの違いは何ですか?

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

、同様に上記のコードで

<?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 
?> 

、私は推測し、それらが作成したオブジェクトは、

$m = new MyClass(); 

そして、上のように、この場合の簡単な作成することができます同じページ、他のコードでオブジェクトをコードを使用して作成した

上記の3つを比較すると、クラス名1を作成する方法が2つ見つかります。$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 

?> 

第2の利点はコードの簡潔さです。上記のFoo \ DateTime名前空間を使用する場合は、クラスからカスタムオブジェクトを作成するときに完全修飾名を使用する必要はありません。これは、カスタムクラスのインスタンスを多数作成する必要がある場合に便利です。

あなたがそうのような名前空間を使用する場合は、あなたの代わりに、完全修飾名のエイリアスとしてそれを書くことができます。

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

名前空間を使用しなくても、あなたが望むならば、あなたは、そのようなオブジェクトを作成する必要がありますPHPのDateTimeクラスの代わりにDateTimeクラスを使用するには:

$myObject = Foo\DateTime(); 
1

私が間に本質的な違い全く存在しないと仮定します

<?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 

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

は、それが明示的にどのあなたが使用するのと同じ名前を持つ2つのクラスのいずれかを示すためにあなたを助けることができます

この場合、aliasingを使用する方が良いと思います。

+0

はい、どちらも同じ出力を与えています。リンクをありがとう、私はそのリンクを参照していると全体のシステムを理解しようとすると、後にコメントを投稿します。ありがとう – codenext

関連する問題