名前空間の長所と短所対PHPのinclude / require?


20

最近、PHPで名前空間を使用し始めました。初めて見たとき、その構文は見苦しく、決して使用しないと思いました。ただし、include / requireステートメントを再度記述する必要がないように、オートローダー(spl_autoload_register)を作成しました。

名前空間が好きですが、include / requireステートメントよりも客観的な利点がありますか、それとも同じ目標を達成するためのまったく同じ方法ですか?


1
名前空間は、サードパーティのライブラリとの衝突を防ぎます。
Reactgular

1
今のところ、名前空間に関する私にとっての主な利点はオートロードです。たとえばnew \Vendor\Namespace\Class()、メソッドまたはクラスの前の段階でrequireステートメントなしでインラインを使用します。
NobleUplift

3
多くのPHPライブラリは、名前空間のない自動読み込みを使用します。PHPはネームスペースを必須にする必要があります。
Reactgular

私からの議論はありません。これらの変更のすべてをここにリストしたいです
NobleUplift

回答:


21

名前空間は、クラスを自動ロードするためだけのものではありません。また、名前の競合を防ぎます。実際、それが彼らの主な目的です。

Userアプリケーションのユーザーに関する情報を保存するためにという名前のクラスを必要とするプロジェクトがあるが、プラグインはUser情報を保存するための名前の(異なる)クラスも使用するとします。名前空間を使用すると、1つの名前空間内にクラスを作成し(たとえば、MyApp)、プラグインが別の名前空間を使用できるようにします(たとえば、CoolPlugin)。MyAppスペース内のコードはUser(たとえばnew User();)を参照するだけでよいため、スペース内のコードも参照できますCoolPlugin。それぞれが期待される結果を取得します。別の名前空間のコードを使用する必要がある場合は、そのプレフィックスを付けるだけです。たとえば、内のコードCoolPluginスペースがアクセス可能UserでクラスをMyApp介して、new \MyApp\User();

代替は、すべてのクラスが複雑な名前を必要としていることであるどこでものような、class MyApp_Userclass CoolPlugin_User。ネームスペースを使用すると、ほとんどの場合、物事を簡素化して、常に名前の競合を回避できます。

編集:質問に答えるために、「2つの間にパフォーマンスの違いはありますか?」

意味のあるものではありません 私はそれをベンチマークしていませんが、おそらくナノ秒レベルで違いがあります。ただし、非常に小さなパフォーマンス調整のためにコード品質を犠牲にすることは良い戦略ではないため、名前空間は関係なく使用する必要があります。同様の問題のベンチマークについては、PHPbench.comおよびこのStackOverflowの回答を参照してください。

この種のコンテキストでコードを微最適化することを心配する前に、コードは信じられないほどタイトで、信じられないほど時間に敏感でなければなりません(高周波取引や核反応の管理を考えてください)。本当に時間に敏感な場合は、おそらくPHPのような解釈言語ではなく、またはでコーディングする必要があります。


1
+1私は、すべてのプロジェクトが名前空間を必要としない可能性があるように見え始め、その後、それらなしで動作するように物事をハックするのはばかげているほど簡単に成長することに注意してください。名前空間を持たないことは、クラスに適用されるように、すべての変数をグローバルに宣言することと基本的に同じです。より大きなコードベースまたはライブラリをリベラルに使用するコードベースでは、それは完全な混乱になります。
ブライアン

1
上記の私の編集をご覧ください。
エリキシニド

2
Large Hadron ColliderのPHPインターフェースを作成していることを言及しましたか?そうでなければ、この答えで十分だと思います、ありがとう。
NobleUplift

1
クォーク星やブラックホールを作成しないでください!喜んでお手伝いします。
エリクセニド

1
心配しないで、ストレンジレットだけ。私たちはハドロンの大砲を作成しています-つまり、何か科学的であり、武器っぽくないものです。
NobleUplift
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.