摘要:完成一部分接口的功能,同時也完成一部分父類的功能。這時,兩個類有了同樣的功能獲取當前對象的經緯度屬性。因為這兩個類確實是完全不相關的,并不應該繼承同一祖先。創建接口,讓這兩個類均實現這兩個接口。
trait完成一部分接口的功能,同時也完成一部分父類的功能。
舉個例子來說明trait的需求場景:
當有兩個class:RetailStore和Car類,這兩個類,他們并不繼承同一個父類,是兩個不同的子類。現在有一個需求,需要這兩個類都顯示他們的經緯度屬性。這時,兩個類有了同樣的功能:獲取當前對象的經緯度屬性。
解決這個問題有3個辦法:
創建一個父類Geocodable,讓兩者都繼承該類。然而這種方法并不好。因為這兩個類確實是完全不相關的,并不應該繼承同一祖先。
創建Geocodable接口,讓這兩個類均實現這兩個接口。這種方法相對好一點,兩個類均能保持自己的繼承層次接口,只在當前的這兩個類中實現這個接口,完成相同的功能。但是,我們要在這兩個類中實現相同的功能,代碼有重復,這樣并不好。
最好的辦法:創建Geocodabletrait,定義并實現經緯度相關方法,然后把在RetailStore和Car兩個類中混入這個trait。這么做,即不會破壞繼承層次結構,同時又實現復用。
創建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; }這樣,每一個RetailStore類都可以使用Geocodable的特性了。
setAddress("your set address"); $store->setGeocoder($geocoder); $latitude = $store->getLatitude(); $longitude = $store->getLongitude(); echo $latitude, ":", $longitude;參考
Modern PHP
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21651.html
摘要:判斷是否存在構造函數,不存在直接實例化,存在則通過來獲取輸入函數,并有相應的方法解決依賴參數問題,實現依賴注入。 Laravel 框架關鍵技術解析·讀書筆記(一) 第一章 入口文件 請求訪問的入口文件,主要完成幾部分工作,分別是: 自動加載函數的添加 服務器實例化與服務注冊 路由加載 請求實例化與路由分發 相應生成與發送 其中,自動加載函數用于包含引用文件,改文件是composer...
摘要:在閱讀文檔的時候看到一個類是以聲明的。是一種代碼復用技術,為的單繼承限制提供了一套靈活的代碼復用機制。下面把的代碼做一個修改以上代碼會輸出。可以看出優先級的順序為,當前類的優先級基類。 ??在閱讀laravel文檔的時候看到一個類 是以 Trait聲明的。平時在工作中從來沒有用過,于是就去看了下官方文檔。原來這個類早在php5.4.0就有了。可惜在項目中從來沒有用過。 ??Trait看...
摘要:關于作者程序開發人員,不拘泥于語言與技術,目前主要從事和前端開發,使用和,端使用混合式開發。和組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和類相關典型問題。它為傳統繼承增加了水平特性的組合也就是說,應用的幾個之間不需要繼承。 關于作者 程序開發人員,不拘泥于語言與技術,目前主要從事PHP和前端開發,使用Laravel和VueJs,App端使用Apicloud混合式開發。合適和...
摘要:是一種為類似的單繼承語言而準備的代碼復用機制。因為中的變量環境是基于函數的,所以會輸出博客鏈接代碼復用機制,本文后續如有更新將會在博客更新。 提到 php 的代碼復用,我們可能第一時間會想到繼承,但是這種單繼承語言一旦派生的子類過多,那么會產生一系列的問題,比如依賴父類、耦合性太大、破壞了類的封裝性。那么有沒有更好的方法來實現代碼復用呢? 自 PHP 5.4.0 起,PHP 實現了另外...
閱讀 3831·2021-10-12 10:12
閱讀 1461·2021-10-11 10:58
閱讀 2297·2021-10-09 10:01
閱讀 2609·2021-09-24 09:48
閱讀 2706·2021-09-09 11:38
閱讀 3531·2019-08-30 15:44
閱讀 1728·2019-08-30 14:22
閱讀 523·2019-08-29 12:42