什麼是性狀?php性狀的應用情境

來源:互聯網
上載者:User
本篇文章給大家帶來的內容是關於什麼是性狀?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解譯器會在編譯時間把性狀複製粘貼到類的定義體中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.