本篇文章給大家帶來的內容是關於什麼是性狀?php性狀的應用情境 ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。
為什麼使用性狀?
PHP語言使用種典型的繼承模型。 在這種模型中,我們先編寫一個通用的根類,實現基本的功能,然後護展這個根類,建立更具體的類,從直接父類繼承實現。這叫做繼承階層, 很多程式設計語言都使用了這個模式。
大多數時候,這種典型的繼承模型能良好運作。可是,如果想讓兩個無關的PHP類具有類似的行為,應該怎麼做呢?例如,RetailStore和Car兩個PHP類的作用十分不同,而且在繼承階層中沒有共同的父類。不過,這兩個類都應該能使用地理編碼技術轉換成經緯度,然後在地圖上顯示。
性狀就是為瞭解決這種問題而誕生的。性狀能把模組化的實現方式往人多個無關的類中。而且性狀還能促進代碼重用。
為瞭解決這個問題,我的第一反應是建立 一個父類Geocodable (這麼做不好),讓Retalstore和Car都繼承這個類。這種解決方案不好,因為我們強制讓兩個無關的類繼承同一個祖先,而且很明顯,這個祖先不屬於各自的繼承階層。
我的最後的反應是建立Geocodable性狀(這麼做最好),定義井實現地理編碼機國發孔這兩個類原本法,然後把在Retailstore和Car兩個類中混人這個性狀。這麼做不會攪古自然的繼承階層。
例如
我們希望RetailStore和Car這兩個類提供地理編碼功能,而且認識到繼承和介面都不最佳方案。我們選擇的方案是建立Geocodable性狀,返回經緯度,然後在地圖中繪製。Geocedable性狀的定義如下:
?phptrait 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;}}
Geocodable性狀只需定義實現地理編碼功能所需的屬性和方法,除此之外什麼都不需,這個Geocodable性狀定義了三個類屬性:一個 表示地址(字串),一個是地理編碼器對象,一個是地理編碼器處理後得到的結果對象。我們還定義了四個公開方法和一個受保護的方法。setGeocoder()方法用 於注入Geocoder對象; setAddress()方法用於設定地址; getlatitude()和getLongitude()方 法分別返回緯度和經度; geocodeAddress()方法把地址字串傳給Geocoder執行個體,擷取經地理編碼器處理得到的結果。
如何使用性狀?
PHP性狀的使用方法很簡單,把use MyTrait;語 句加到PHP類的定義體中即可。下面是個樣本。顯然,實際使用時要把MyTrait替換成相應的PHP性狀名。
<?phpclass MyClass{ use MyTrait; //這是類的實現}
建議:命名空間和性狀都使用use關鍵字導人,可是導人的位置有所不同。命名空間、類、介面、函數和常量在類的定義體外導人,而性狀在類的定義體內導人。這個區別雖然小,但很重要。並且使用use的前提是你已經include引入PHP檔案。
我們只需做這麼多。現在,每個Retailstore執行個體都能使用Geocodable性狀提供的屬性和方法了,即:
$store = new RetailStore();$store->setddress('420 9th Avenue, New York, NY 10001 USA');
php解譯器會在編譯時間把性狀複製粘貼到類的定義體中。