2011-12-22 12 views
10

私はPHPで名前空間を使っていたが、最近はuseキーワードを使ったプロジェクトを見て、名前空間なしで普通のように名前空間オブジェクトにアクセスした。これはPHPで名前空間を使う良い方法ですか

私の質問が正しい以下のコードで、それはそれはそれはそこかけることなく、これらのオブジェクトのいずれかにアクセスすることができ\MyLibrary\Registry\MyLibrary\User\MyLibrary\Request

に持参するuseを使用するファイルindex.phpをhsは名前空間MyLibrary\Baseを使用して、ありますその前に名前空間があるので、useセクションの下にある実際のコードは、通常のプレネームスペースPHPファイルのように見えます。

これは名前空間の使用方法ですか?または私は何かを逃していますか?

ファイル:

<?php 
namespace MyLibrary\Base; 

use \MyLibrary\Registry; 
use \MyLibrary\User; 
use \MyLibrary\Request; 


class Base 
{ 
    public $registry; 

    function __construct($registry) 
    { 
     $this->registry = $registry; 
     $this->user = New User; 
     $this->request = new Request; 
     # code... 
    } 
} 
?> 

ファイルのindex.php:registry.class.php

<?php 
namespace MyLibrary\Registry; 

class Registry 
{ 
    public $user; 

    function __construct($user) 
    { 
     $this->user = $user; 
     # code... 
    } 
} 
?> 

答えて

5

はい。 use -statementは、クラスまたは名前空間名を現在のスコープにインポートします。そのはるかに短い、Vendor_Package_Foo_Bar_XyzClassよりも、およびb)あなたが使用するクラスを交換することができますので、それは、すべてが読みやすく

namespace MyFirstNamespace { 
    class Foo {} 
} 
namespace MySecondNamespace { 
    use \MyFirstNamespace\Foo as Bar; 
    $foo = new Bar; 
} 

a))は、短いが、PHP-開発者が名前空間を実現した理由は、あるすべてのものを書くために、とても早い。

# use \MyFirstNamespace\Foo as Bar; // I don't like Foo anymore 
use \MyFirstNamespace\SimilarToFoo as Bar; 
+1

驚くべきことに、私はコード全体で邪魔な '\\'セパレータを扱わなければならないと思ったので、本当に欲しくない前に名前空間を使いたいと思っています。これは私にPythonを思い出させます。あなたはライブラリをインポートする方法を思い出します。 – JasonDavis

+0

実際に私は言うべきです、C#のように使用します... 'using System;' 'using System.Collections.Generic;'など...彼らが名前空間をインポートしていたことに気付かなかった。私はまた、NSセパレータとしてドット/ピリオドでどのくらい良く見えるかを見ることができます。 – JasonDavis

+0

あなたが 'use \ MyFirstNamespace \ FooをBarとして投稿したような簡単な質問ですが、そのような名前を変更することはできますが、私が見たコードでは、私の例のようにしました...' use \ MyFirstNamespace \ Foo ;そして、 'Foo'を使ってアクセスすることは可能ですか?私は何も設定されていないことに注意してください。これを 'use \ MyFirstNamespace \ Foo as Foo;'のように設定する必要がありますか? – JasonDavis

3

名前空間には多くの利点があります。

最初は、別の名前空間内に存在するという意味でメソッド名やクラス名を再利用することができます。例:

namespace \myNamespace\data\postgres; 

class DataBase extends \PDO 
{ 
} 

namespace \myNamespace\data\mysql; 

class DataBase extends \PDO 
{ 
} 
あなたも一緒に命名を気にすることなく
namespace \myNamespace\dir; 

function makedir() 
{ 
    if (// some condition is true) 
    { 
     \makedir(); 
    } 
} 

このすべて

は、それが簡単に異なるソースからのコードを使用することにすることを意図して、通常はPHPの機能のために予約されている名前を再利用することができ

紛争。プログラマーがいくつかの簡単なルールを遵守するのに十分なほど丁寧であれば、名前の競合の可能性は大幅に減ります。実際に、ネーミング競合を避けるためにあなたが気にする必要がある唯一のルールは、ネームスペースの最初のレベルを自分自身で作ることです。たとえば、会社名や、名前空間の第1レベルとしてユニークなベンダーとしてあなたを識別するその他の方法を使用してください。すべてが良好でなければなりません。

たとえば、別のルート名前空間を選択した人と衝突することを心配することなく、その名前空間の下でクラスを呼び出すことができるので、私はすべてのコードのルート名前空間として\ gordianを使用します。

PEARの慣習で何が問題なのですか?一般的なZendフレームワークを含む多くのプロジェクトがこれに続きます。

答えはとても素早く非常に扱いにくくなります。例えば、ZendはPEAR規約に従うので、一種の疑似名前空間を使います。コレクション内のすべてのクラスはZend_で始まり、クラス階層の各レベルで名前にさらなる部分を追加します。
Ze その結果、Zend_Db_Adaptor_AbstractやZend_Dojo_Form_Decorator_TabContainerのようなクラス名になります。

Zendは、名前空間を使用するようにフレームワークを更新する必要があります(私はZend Framework 2.0で起こっていると言います)。\ Zend \ Db \ Adapter \ Abstractと\ Zend \ Dojo \ Form \ Decorator \代わりにTabContainerを使用します。だから、あなたは聞くかもしれない?その答えは、あなたが既に見たように、あなたがそれらをより短い名前にエイリアスできることです。つまり、クラス名を完全に書き留めておく必要はありませんが、エイリアス化したものに限ります。

use \Zend\Dojo\Forn\Decorator as Dec; 

$a = new Dec\TabContainer; // Not easy to do without namespaces! 

さらにより多くのあなたが与えられた名前空間に既にしている場合、それは自動的に起こるように、そしてあなたも、短い名前で、同じ名前空間内の他の項目にアクセスするために使用するキーワードを使用する必要はありませんあなたはその場合です。フレームワークの作家にとって、これは巨大な時間節約です。

例えば、Zend Framework 2のフォローイングのようなものがあるかもしれません(私はそれをやっていないので、これは純粋な例であり、実際のZF2ソースからではありません)。

namespace \Zend\Db\Adaptor; 

class Postgres extends Abstract // We don't need to use \Zend\Db\Adaptor\Abstract here because it's in the same namespace already anyway 
{ 
} 

他の利点は、それが(あなたの名前空間の構造は、ファイルシステムのディレクトリ構造上に正確にマッピングして)作るためにオートローダは途方もなく簡単になりますよう、あまりにもあります。

名前空間は、実際にはあまり重要ではない、あるいは意味を成さないように見えるかもしれませんが、少しでも使用した後、その有用性は突然非常に明白になります。

関連する問題