web-dev-qa-db-ja.com

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

最近、PHPで名前空間を使い始めました。それらを初めて見たとき、私はそれらの構文は醜いと思ったので使用しませんでした。しかし、私はそれを作成するオートローダー(spl_autoload_register)を作成したので、include/requireステートメントを再度記述する必要はありません。

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

21
NobleUplift

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

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

代替案は、すべてのクラスがclass MyApp_Userclass CoolPlugin_Userなどの複雑な名前everywhereを必要とすることです。名前空間を使用すると、ほとんどの場合事柄を単純化し、名前の競合を常に回避できます。

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

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

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

22
elixenide