為什么使用性狀?
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; html' target='_blank'>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文件。
我們只需做這么多?,F在,每個Retailstore實例都能使用Geocodable性狀提供的屬性和方法了,即:
$store = new RetailStore();$store- setddress( 420 9th Avenue, New York, NY 10001 USA
php解釋器會在編譯時把性狀復制粘貼到類的定義體中。
相關推薦:
PHP命名空間、性狀與生成器詳解
以上就是什么是性狀?php性狀的應用場景的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答