ホームページ  >  記事  >  バックエンド開発  >  特性とは何ですか? PHP トレイトの適用シナリオ

特性とは何ですか? PHP トレイトの適用シナリオ

不言
不言オリジナル
2018-08-29 15:29:331818ブラウズ

この記事の内容は、特性とは何ですか? PHPトレイトの適用シナリオはある程度参考になるので、困っている方は参考にしていただければ幸いです。

なぜ特性を使用するのですか?

PHP 言語は、典型的な継承モデルを使用します。このモデルでは、まず一般的なルート クラスを作成して基本機能を実装し、次にこのルート クラスを拡張して、直接の親クラスから実装を継承するより具体的なクラスを作成します。これは継承階層と呼ばれ、多くのプログラミング言語がこのパターンを使用します。

ほとんどの場合、この典型的な継承モデルはうまく機能します。ただし、無関係な 2 つの PHP クラスに同様の動作をさせたい場合はどうすればよいでしょうか? たとえば、2 つの PHP クラス RetailStore と Car は非常に異なる機能を持ち、継承階層に共通の親クラスがありません。ただし、どちらのクラスもジオコーディング技術を使用して緯度と経度に変換し、地図上に表示できる必要があります。
トレイトは、この問題を解決するために生まれました。トレイトを使用すると、モジュール実装を無関係な複数のクラスに実装できます。また、特性はコードの再利用を促進することもあります。
この問題を解決するために、私の最初の反応は、親クラス Geocodable (これは良くありません) を作成し、Retalstore と Car の両方にこのクラスを継承させることでした。この解決策は、無関係な 2 つのクラスに同じ祖先からの継承を強制しており、この祖先がそれぞれの継承階層に属していないことが明らかであるため、不適切です。
私の最終的な反応は、Geocodable トレイトを作成し (これが最善の方法です)、Geocodable クラス メソッドを定義して実装し、このトレイトを Retailstore クラスと Car クラスに混合することでした。そうすることで、自然な継承階層が乱されることはありません。

例:

RetailStore クラスと Car クラスがジオコーディング機能を提供することを望みますが、継承とインターフェイスが最適なソリューションではないことを認識しています。私たちが選択した解決策は、Geocodable 特性を作成し、緯度と経度を返し、それを地図にプロットすることでした。ジオコーディング可能な特性の定義は次のとおりです:

?php
trait Geocodable {
	/** @var string */
	protected $address;

	/** @var \Geocoder\Geocoder */
	protected $geocoder;
	/** @var \GeocoderlResult\Geocoded */
	protected $geocoderResult;
	public function setGeocoder(\Geocoder\GeocoderIntertace $geocoder){
		$this->geocoder = $geocoder;

	}
	public function setAddress($address){
		$this->address = $address; 
	}

	public function getLatitude(){
		if (isset($this->geocoderResult) === false){
			$this->geocodeAddress();
		}
		return $this->geocoderResult->getLatitude();
	}
	public function getlongitude(){
		if (isset($this->geocoderResult) === false){
			$this->geocodeAddress();
		}
		return $this->geocoderResult->getLongitude();
	}
	protected function geocodeAddress(){
		$this->geocoderResult = $this->geocoder->geocode($this->address);
		return true;
	}
}

ジオコーディング可能な特性は、ジオコーディング機能の実装に必要な属性とメソッドを定義するだけでよく、他には何も必要ありません。このジオコーディング可能な特性は 3 つのクラス属性を定義します。1 つは住所を表します。 (文字列)、1 つはジオコーダー オブジェクト、もう 1 つはジオコーダーの処理後に取得された結果オブジェクトです。また、4 つのパブリック メソッドと 1 つの保護されたメソッドも定義します。 setGeocoder() メソッドは Geocoder オブジェクトの挿入に使用され、setAddress() メソッドは住所の設定に使用され、getlatitude() メソッドと getLongitude() メソッドはそれぞれ緯度と経度を返し、 geocodeAddress() メソッドは住所文字列を渡します。 Geocoder インスタンスに送信して経度を取得します。 エンコーダー処理によって得られた結果。
特性を使用するにはどうすればよいですか?

PHP トレイトの使用方法は非常に簡単で、PHP クラスの定義本体に use MyTrait; ステートメントを追加するだけです。ここに例を示します。明らかに、実際に使用する場合は、MyTrait を対応する PHP 特性名に置き換える必要があります。

<?php
class MyClass{
    use MyTrait;
    //这是类的实现
}

提案: use キーワードを使用して名前空間と特性の両方をインポートしますが、インポート場所は異なります。名前空間、クラス、インターフェイス、関数、および定数はクラス定義の外部にインポートされ、特性はクラス定義の内部にインポートされます。違いは小さいですが、重要です。また、 use を使用するための前提条件は、PHP ファイルがインクルードされていることです。

やるべきことは限られています。これで、すべての Retailstore インスタンスは、Geocodable トレイトによって提供されるプロパティとメソッドを使用できるようになります。

$store = new RetailStore();
$store->setddress(&#39;420 9th Avenue, New York, NY 10001 USA&#39;);

php インタープリターは、コンパイル時にトレイトをコピーしてクラス定義本体に貼り付けます。

関連する推奨事項:

PHP 名前空間、特性、ジェネレーターの詳細な説明

以上が特性とは何ですか? PHP トレイトの適用シナリオの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。