名前空間-PHPの名前空間の利点
PHPでの名前空間について調査した後、ライブラリアイテムをグループ化して同じクラス名を再利用する以外に、実際の利点は何かを理解しようとしています。
名前付けについて私が気に入らないのは、ファイルの先頭にあるこれらの余分な行で、「use core \ whatever \ class」からクラスを呼び出しています。これは、標準的なアプローチとは関係ありません。
また、情報が見つかりませんでした。同じ名前の2つのクラスを使用する必要があるが、同じメソッド名を含む異なるフォルダーで使用する必要がある場合はどうなりますか?それでも名前空間を呼び出す必要がありますが、コードはどのクラスのどのメソッドを使用する必要があるかをどのように判断するのでしょうか。
名前付けを始めたばかりなので、この質問が非常に基本的に聞こえる場合は失礼します。
また、静的メソッド(たとえばHelperクラスなど)ではどのように機能しますか?また、この名前空間が必要であることを示す必要があります'use core \ whatever \ Helper'?
答え :
解決策:
多数のクラスを含む大規模なプロジェクトがある場合、最終的に名前の競合が発生します。 db/mysql/adapter.php
とhttp/curl/adapter.php
があります。名前なしでこれに対処するには、クラスに Db_Mysql_Adapter
やHttp_Curl_Adapter
などの一意の名前を付ける必要があります。また、参照するときはいつでもこれらのクラスは、フルネームを使用する必要があります。
名前空間を使用すると、クラスに Db\Mysql\Adapter
とHttp\Curl\Adapter
という名前を付け、{-code-で簡単に参照できます。ローカル名前空間では7}
、他の名前空間ではそれぞれ MySQL \ Adapter
とCurl\ Adapter
。これにより、多くの入力を節約できます。
Zend Frameworkバージョン1とバージョン2のソースを参照するだけで、違いを確認できます。
同じ名前の2つのクラスを使用する必要があるが、同じメソッド名を含む異なるフォルダーで使用する必要がある場合はどうなりますか?それでも名前空間を呼び出す必要がありますが、コードはどのクラスのどのメソッドを使用する必要があるかをどのように判断しますか?
名前空間
Db\Mysql
にいる場合、Adapter :: foo()
は{-code-を参照します5}
と\Http\Curl\Adapter :: foo()
はもう一方を参照します。常に名前全体を書きたくない場合は、ファイルの先頭でクラスのエイリアスを作成することもできます。名前空間Db\Mysql; Http\Curl\AdapterをHAdapterとして使用します。 Adapter :: foo(); //Mysqlアダプター H Adapter :: foo(); // Httpアダプター、次と同じ: \ Http\Curl\Adapter :: foo();
答え :
解決策:
名前付けについて私が気に入らないのは、ファイルの先頭にあるこれらの余分な行で、「use core \ whatever \ class」からクラスを呼び出しています。これは、標準的なアプローチとは関係ありません。
名前空間はクラスを論理的にグループ化し、グローバルスコープを汚染しないようにします。また、PHPコードの大きなチャンク(サイトの他の場所で必要な部分が含まれている可能性のあるコード)を作成することもできなくなります。これにより、サイトの別の部分で使用できるように、別のファイルに配置する理由が増えます。繰り返してはいけません(DRY)、多くの場所で使用しますが、コーディングは1回だけです!
同じ名前の2つのクラスを使用する必要があるが、同じメソッド名を含む異なるフォルダーで使用する必要がある場合はどうなりますか?それでも名前空間を呼び出す必要がありますが、コードはどのクラスのどのメソッドを使用する必要があるかをどのように判断しますか?
名前空間は、エイリアスを使用してこれらの問題を防ぎます。その上、同じ名前のクラスがありますか?
api.document.events
やapi.ajax.events
のように、名前は同じでも目的やサブカテゴリが異なる場合を除きます。そうでなければ、それは悪いプログラム設計です。
答え :
解決策:
この回答は@decezeの回答に焦点を当てています。
彼の主張は、異なる名前の2つのクラスを持つことはより複雑であるということです。ですか?
1。)ファイルを含めたことがないため、彼のサンプルコードは機能しません。したがって、次のようになっている必要があります:
namespace Db\Mysql;
use Http\Curl\Adapter as HAdapter;
include('Db/Mysql/Adapter.php');
include('Http/Curl/Adapter.php');
Adapter::foo(); // Mysql adapter
HAdapter::foo(); // Http adapter, same as:
\Http\Curl\Adapter::foo();
2。)このファイルにも名前空間定義を追加しない限り、 adapter.php
ファイルを含めることはできません。
<?php
// this is Db/Mysql/Adapter.php
namespace Db/Mysql;
class Adapter {
static function foo() {
}
}
?>
そして今、非名前空間バリアント:
include('db / mysql / adapter.php');
include('http / curl / adapter.php');
MysqlAdapter :: foo(); //Mysqlアダプター
CurlAdapter :: foo(); //Httpアダプター
adapter.php
は次のようになります:
<?php
// this is Db/Mysql/Adapter.php
class MysqlAdapter {
static function foo() {
}
}
?>
最後に、以前と同じ数のファイルを編集し、以前と同じようにコードを追加する必要があります。したがって、これは議論にはなり得ません。
存在する可能性のある唯一の議論は、競合するサードパーティライブラリの問題を回避することです。しかし、過去にいくつの名前の競合がありましたか?また、名前を使用しているため、すべてのファイルを編集する必要がないライブラリがいくつあるか知っていますか?
実際のところ、現実の世界にはメリットはありません。これはCの世界から採用されたものであり、私の意見ではメリットよりも混乱を招きます。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。