為什么使用性狀?
PHP語(yǔ)言使用種典型的繼承模型。 在這種模型中,我們先編寫(xiě)一個(gè)通用的根類(lèi),實(shí)現(xiàn)基本的功能,然后護(hù)展這個(gè)根類(lèi),創(chuàng)建更具體的類(lèi),從直接父類(lèi)繼承實(shí)現(xiàn)。這叫做繼承層次結(jié)構(gòu), 很多編程語(yǔ)言都使用了這個(gè)模式。
大多數(shù)時(shí)候,這種典型的繼承模型能良好運(yùn)作。可是,如果想讓兩個(gè)無(wú)關(guān)的PHP類(lèi)具有類(lèi)似的行為,應(yīng)該怎么做呢?例如,RetailStore和Car兩個(gè)PHP類(lèi)的作用十分不同,而且在繼承層次結(jié)構(gòu)中沒(méi)有共同的父類(lèi)。不過(guò),這兩個(gè)類(lèi)都應(yīng)該能使用地理編碼技術(shù)轉(zhuǎn)換成經(jīng)緯度,然后在地圖上顯示。
性狀就是為了解決這種問(wèn)題而誕生的。性狀能把模塊化的實(shí)現(xiàn)方式往人多個(gè)無(wú)關(guān)的類(lèi)中。而且性狀還能促進(jìn)代碼重用。
為了解決這個(gè)問(wèn)題,我的第一反應(yīng)是創(chuàng)建 一個(gè)父類(lèi)Geocodable (這么做不好),讓Retalstore和Car都繼承這個(gè)類(lèi)。這種解決方法不好,因?yàn)槲覀儚?qiáng)制讓兩個(gè)無(wú)關(guān)的類(lèi)繼承同一個(gè)祖先,而且很明顯,這個(gè)祖先不屬于各自的繼承層次結(jié)構(gòu)。
我的最后的反應(yīng)是創(chuàng)建Geocodable性狀(這么做最好),定義井實(shí)現(xiàn)地理編碼機(jī)國(guó)發(fā)孔這兩個(gè)類(lèi)原本法,然后把在Retailstore和Car兩個(gè)類(lèi)中混人這個(gè)性狀。這么做不會(huì)攪古自然的繼承層次結(jié)構(gòu)。
我們希望RetailStore和Car這兩個(gè)類(lèi)提供地理編碼功能,而且認(rèn)識(shí)到繼承和接口都不最佳方案。我們選擇的方案是創(chuàng)建Geocodable性狀,返回經(jīng)緯度,然后在地圖中繪制。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性狀只需定義實(shí)現(xiàn)地理編碼功能所需的屬性和方法,除此之外什么都不需,這個(gè)Geocodable性狀定義了三個(gè)類(lèi)屬性:一個(gè) 表示地址(字符串),一個(gè)是地理編碼器對(duì)象,一個(gè)是地理編碼器處理后得到的結(jié)果對(duì)象。我們還定義了四個(gè)公開(kāi)方法和一個(gè)受保護(hù)的方法。setGeocoder()方法用 于注入Geocoder對(duì)象; setAddress()方法用于設(shè)定地址; getlatitude()和getLongitude()方 法分別返回緯度和經(jīng)度; geocodeAddress()方法把地址字符串傳給Geocoder實(shí)例,獲取經(jīng)地理編碼器處理得到的結(jié)果。
如何使用性狀?
PHP性狀的使用方法很簡(jiǎn)單,把use MyTrait;語(yǔ) 句加到PHP類(lèi)的定義體中即可。下面是個(gè)示例。顯然,實(shí)際使用時(shí)要把MyTrait替換成相應(yīng)的PHP性狀名。
?phpclass MyClass{ use MyTrait; //這是類(lèi)的實(shí)現(xiàn)}
建議:命名空間和性狀都使用use關(guān)鍵字導(dǎo)人,可是導(dǎo)人的位置有所不同。命名空間、類(lèi)、接口、函數(shù)和常量在類(lèi)的定義體外導(dǎo)人,而性狀在類(lèi)的定義體內(nèi)導(dǎo)人。這個(gè)區(qū)別雖然小,但很重要。并且使用use的前提是你已經(jīng)include引入PHP文件。
我們只需做這么多。現(xiàn)在,每個(gè)Retailstore實(shí)例都能使用Geocodable性狀提供的屬性和方法了,即:
$store = new RetailStore();$store- setddress( 420 9th Avenue, New York, NY 10001 USA
php解釋器會(huì)在編譯時(shí)把性狀復(fù)制粘貼到類(lèi)的定義體中。
相關(guān)推薦:
PHP命名空間、性狀與生成器詳解
以上就是什么是性狀?php性狀的應(yīng)用場(chǎng)景的詳細(xì)內(nèi)容,PHP教程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注