摘要:完成一部分接口的功能,同時(shí)也完成一部分父類(lèi)的功能。這時(shí),兩個(gè)類(lèi)有了同樣的功能獲取當(dāng)前對(duì)象的經(jīng)緯度屬性。因?yàn)檫@兩個(gè)類(lèi)確實(shí)是完全不相關(guān)的,并不應(yīng)該繼承同一祖先。創(chuàng)建接口,讓這兩個(gè)類(lèi)均實(shí)現(xiàn)這兩個(gè)接口。
trait完成一部分接口的功能,同時(shí)也完成一部分父類(lèi)的功能。
舉個(gè)例子來(lái)說(shuō)明trait的需求場(chǎng)景:
當(dāng)有兩個(gè)class:RetailStore和Car類(lèi),這兩個(gè)類(lèi),他們并不繼承同一個(gè)父類(lèi),是兩個(gè)不同的子類(lèi)?,F(xiàn)在有一個(gè)需求,需要這兩個(gè)類(lèi)都顯示他們的經(jīng)緯度屬性。這時(shí),兩個(gè)類(lèi)有了同樣的功能:獲取當(dāng)前對(duì)象的經(jīng)緯度屬性。
解決這個(gè)問(wèn)題有3個(gè)辦法:
創(chuàng)建一個(gè)父類(lèi)Geocodable,讓兩者都繼承該類(lèi)。然而這種方法并不好。因?yàn)檫@兩個(gè)類(lèi)確實(shí)是完全不相關(guān)的,并不應(yīng)該繼承同一祖先。
創(chuàng)建Geocodable接口,讓這兩個(gè)類(lèi)均實(shí)現(xiàn)這兩個(gè)接口。這種方法相對(duì)好一點(diǎn),兩個(gè)類(lèi)均能保持自己的繼承層次接口,只在當(dāng)前的這兩個(gè)類(lèi)中實(shí)現(xiàn)這個(gè)接口,完成相同的功能。但是,我們要在這兩個(gè)類(lèi)中實(shí)現(xiàn)相同的功能,代碼有重復(fù),這樣并不好。
最好的辦法:創(chuàng)建Geocodabletrait,定義并實(shí)現(xiàn)經(jīng)緯度相關(guān)方法,然后把在RetailStore和Car兩個(gè)類(lèi)中混入這個(gè)trait。這么做,即不會(huì)破壞繼承層次結(jié)構(gòu),同時(shí)又實(shí)現(xiàn)復(fù)用。
創(chuàng)建Trait定義trait:
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->getLonnitude(); } protected function geocodeAddress() { $this->geocoderResult = $this->geocoder->geocode($this->address); return true; } }如何使用class RetailStore { use Geocodable; }這樣,每一個(gè)RetailStore類(lèi)都可以使用Geocodable的特性了。
setAddress("your set address"); $store->setGeocoder($geocoder); $latitude = $store->getLatitude(); $longitude = $store->getLongitude(); echo $latitude, ":", $longitude;參考
Modern PHP
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/21651.html
摘要:的機(jī)器學(xué)習(xí)庫(kù)的機(jī)器學(xué)習(xí)庫(kù),包括算法交叉驗(yàn)證神經(jīng)網(wǎng)絡(luò)等內(nèi)容。在即將到來(lái)的大會(huì)上,她將和大家分享在機(jī)器學(xué)習(xí)領(lǐng)域的全新可能。入門(mén)總結(jié)入門(mén)相關(guān),如安裝配置基本使用等。 基于 Swoole 開(kāi)發(fā) PHP 擴(kuò)展 Swoole-1.9.7 增加了一個(gè)新特性,可以基于 Swoole 使用 C++ 語(yǔ)言開(kāi)發(fā)擴(kuò)展模塊,在擴(kuò)展模塊中可以注冊(cè) PHP 內(nèi)置函數(shù)和類(lèi)?,F(xiàn)在可以基于 Swoole 來(lái)編寫(xiě) PHP ...
摘要:判斷是否存在構(gòu)造函數(shù),不存在直接實(shí)例化,存在則通過(guò)來(lái)獲取輸入函數(shù),并有相應(yīng)的方法解決依賴參數(shù)問(wèn)題,實(shí)現(xiàn)依賴注入。 Laravel 框架關(guān)鍵技術(shù)解析·讀書(shū)筆記(一) 第一章 入口文件 請(qǐng)求訪問(wèn)的入口文件,主要完成幾部分工作,分別是: 自動(dòng)加載函數(shù)的添加 服務(wù)器實(shí)例化與服務(wù)注冊(cè) 路由加載 請(qǐng)求實(shí)例化與路由分發(fā) 相應(yīng)生成與發(fā)送 其中,自動(dòng)加載函數(shù)用于包含引用文件,改文件是composer...
摘要:在閱讀文檔的時(shí)候看到一個(gè)類(lèi)是以聲明的。是一種代碼復(fù)用技術(shù),為的單繼承限制提供了一套靈活的代碼復(fù)用機(jī)制。下面把的代碼做一個(gè)修改以上代碼會(huì)輸出??梢钥闯鰞?yōu)先級(jí)的順序?yàn)?,?dāng)前類(lèi)的優(yōu)先級(jí)基類(lèi)。 ??在閱讀laravel文檔的時(shí)候看到一個(gè)類(lèi) 是以 Trait聲明的。平時(shí)在工作中從來(lái)沒(méi)有用過(guò),于是就去看了下官方文檔。原來(lái)這個(gè)類(lèi)早在php5.4.0就有了??上г陧?xiàng)目中從來(lái)沒(méi)有用過(guò)。 ??Trait看...
摘要:關(guān)于作者程序開(kāi)發(fā)人員,不拘泥于語(yǔ)言與技術(shù),目前主要從事和前端開(kāi)發(fā),使用和,端使用混合式開(kāi)發(fā)。和組合的語(yǔ)義定義了一種減少?gòu)?fù)雜性的方式,避免傳統(tǒng)多繼承和類(lèi)相關(guān)典型問(wèn)題。它為傳統(tǒng)繼承增加了水平特性的組合也就是說(shuō),應(yīng)用的幾個(gè)之間不需要繼承。 關(guān)于作者 程序開(kāi)發(fā)人員,不拘泥于語(yǔ)言與技術(shù),目前主要從事PHP和前端開(kāi)發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開(kāi)發(fā)。合適和...
摘要:是一種為類(lèi)似的單繼承語(yǔ)言而準(zhǔn)備的代碼復(fù)用機(jī)制。因?yàn)橹械淖兞凯h(huán)境是基于函數(shù)的,所以會(huì)輸出博客鏈接代碼復(fù)用機(jī)制,本文后續(xù)如有更新將會(huì)在博客更新。 提到 php 的代碼復(fù)用,我們可能第一時(shí)間會(huì)想到繼承,但是這種單繼承語(yǔ)言一旦派生的子類(lèi)過(guò)多,那么會(huì)產(chǎn)生一系列的問(wèn)題,比如依賴父類(lèi)、耦合性太大、破壞了類(lèi)的封裝性。那么有沒(méi)有更好的方法來(lái)實(shí)現(xiàn)代碼復(fù)用呢? 自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了另外...
閱讀 3903·2021-10-12 10:12
閱讀 1541·2021-10-11 10:58
閱讀 2381·2021-10-09 10:01
閱讀 2684·2021-09-24 09:48
閱讀 2780·2021-09-09 11:38
閱讀 3587·2019-08-30 15:44
閱讀 1804·2019-08-30 14:22
閱讀 576·2019-08-29 12:42