国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > PHP > 正文

什么是性狀?php性狀的應(yīng)用場(chǎng)景

2020-03-22 19:28:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于什么是性狀?php性狀的應(yīng)用場(chǎng)景 ,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

為什么使用性狀?

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)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 盐亭县| 内江市| 龙里县| 固原市| 彩票| 镇远县| 曲靖市| 开江县| 安多县| 花莲县| 常州市| 元氏县| 旺苍县| 阜南县| 江门市| 惠来县| 琼结县| 鱼台县| 龙陵县| 惠水县| 钦州市| 开阳县| 麻城市| 南通市| 池州市| 来宾市| 工布江达县| 潜山县| 石嘴山市| 那坡县| 黔江区| 阿克苏市| 襄樊市| 惠水县| 汉沽区| 乾安县| 冕宁县| 河津市| 镇远县| 开阳县| 新津县|