[Modern PHP] 第二章 新功能之三 Traits
Traits
我的許多PHP開發者朋友都不太了解traits,這是PHP 5.4.0中引入的新概念。 traits看起來像介面但是用起來像類,那究竟是什麼呢?兩者都不是。
一個trait擁有部分實現(譬如常量、屬性和方法),可以被植入到一個或多個實際的PHP類中。 trait有兩個職責:表示一個類別可以做什麼(類似介面);提供一個模組化的實作(類似類別)。
在其他的語言中你也許已經對traits有了一定的了解。譬如Ruby的modules及mixins功能就和PHP的traits很類似。
我們為什麼要使用traits
PHP語言使用的是經典的繼承模型。這意味著你從一個提供了基本實作的通用的根類別開始。從根類創造出更具體的類,它們直接繼承了父類的各種實作。這叫做繼承層次,許多程式語言使用的都是這種公用的模式。
為了方便理解,假設你穿越回高中學習生物。還記得你學習的生物的界門綱目科屬種嗎?總共有六大界,界派生出門、門派生出綱、綱派生出目、目派生出科、科派生出屬、屬後面是種。在物種的層級上的每次向下的派生都代表著具體的特性。
經典的繼承模型大多數情況下都能工作的很好。但是,如果有兩個毫無關聯的類別需要實現類似的行為該如何解決?例如,一個PHP類叫RetailStore,而另一個PHP類叫Car,它們兩個可以是說是完全風馬牛不相及的兩個類,在繼承關係上根本無法共享一個公用的父類。然而兩個類別都需要使用地理位置中的經度和緯度來顯示地圖座標。
我們創造traits就是來解決這個問題的。它們可以將部分實現注入到不相干的類別中。 traits也同樣利於程式碼的重用。
遇到這個問題,我的第一個解決方案(也是最糟糕的)是創造一個公共的父類Geocodable用來給RetailStore和Car這兩個類別來繼承。這個解決方案實在是太糟糕了,因為強行讓兩個毫不相干的類別取共享一個公共的祖先,在它們各自的繼承層級上都顯得格外彆扭。
我的第二個解決方案(稍微好點)是創造一個Geocodable介面來定義實作地理位置需要哪些方法。 RetialStore和Car兩個類別都可以實作這個Geocodable介面。讓每個類別都能保留各自自然的繼承關係確實是個很好的解決方案。但是我們還是需要在每個類別裡都重複的去實作介面裡的定義,這可不是一個DRY的方案。
DRY是Do not repeat yourself的縮寫。作為一個好的程式設計習慣,我們永遠不要在多個地方重複同樣的程式碼。不能出現因為改了一處程式碼,而被動的還要去修改其他地方同樣的程式碼的狀況。
我的第三個方案(最佳方案)是建構一個Geocodable的trait,在裡面定義並實現相關的方法。我可以在不打亂類別的繼承層級的情況下把Geocodable的trait加到RetailStore類別和Car類別中。
如何構造一個trait
下面展示的是如何定義一個PHP的trait:
<?php trait MyTrait { // 此处是trait的具体实现 }
作為一個好習慣,我們應該做到一個文件和一個trait,就像類和接口的定義一樣。
讓我們回到我們的Geocodable範例來更好的示範一下trait的使用。我們都知道RetailStore類別和Car類別需要支援地理位置的定位功能,而我們也都能認同繼承和介面並不是最佳方案。取而代之,我們建構一個Geocodable trait來傳回一個可以在地圖上標記的經度和緯度座標。範例2-12中是我們完整的Geocodable trait。
例子 2-12 Geocodable trait的定義
<span style="font-size:14px;"><?php trait Geocodable { /** @var string */ protected $address; /** @var \Geocoder\Geocoder */ protected $geocoder; /** @var \Geocoder\Result\Geocoded */ protected $geocoderResult; public function setGeocoder(\Geocoder\GeocoderInterface $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; } }</span>
Geocodable trait僅僅只定義了執行地理位置所需的屬性和方法所需的任何屬性和方法。
我們的Geocodable trait定義了三個類別的屬性:
未完待續…
以上就介紹了[Modern PHP] 第二章 新功能之三 Traits,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHPtraitDTO:簡化資料傳輸物件的開發引言:在現代的軟體開發中,資料傳輸物件(DataTransferObject,簡稱DTO)扮演了重要的角色。 DTO是一種純粹的資料容器,用於在層與層之間傳遞資料。然而,在開發過程中,開發人員需要編寫大量的相似的程式碼來定義和操作DTO。為了簡化這個過程,PHP引入了trait特性,我們可以利用trait特

深入了解PHPtraitDTO的設計模式與實務Introduction:在PHP開發中,設計模式是不可或缺的一部分。其中,DTO(DataTransferObject)是一種常用的設計模式,用於封裝資料傳輸的物件。而在實現DTO的過程中,使用trait(特徵)可以有效提高程式碼的複用性和靈活性。本文將深入探討PHP中traitDTO的設計模式與實踐

PHPtraitDTO:優化資料傳輸過程的關鍵利器,需要具體程式碼範例簡介:在開發過程中,資料傳輸是一個非常常見的需求,尤其是在不同層級之間傳遞資料時。在傳輸這些資料過程中,我們常常需要對資料進行處理、驗證或轉換,以滿足不同的業務需求。為了提高程式碼的可讀性和可維護性,我們可以使用PHPtraitDTO(DataTransferObject)來最佳化

PHPtraitDTO:實現資料傳輸物件的簡潔性與彈性引言:在PHP開發過程中,經常會涉及資料的傳輸與處理。而傳輸物件模式(DataTransferObject,簡稱DTO)是一種設計模式,它用於將資料在不同層之間傳輸。在傳輸過程中,DTO透過封裝資料、提供公共存取方法來簡化資料的操作。本文將介紹如何使用PHPtrait來實現DT

使用PHPtraitDTO實現高度可自訂的資料傳輸框架隨著網站和應用程式變得越來越複雜,資料傳輸變得越來越重要。在PHP中,透過使用資料傳輸物件(DataTransferObject,簡稱DTO)來處理資料傳輸可以大幅簡化程式碼,並提高可維護性和擴展性。本文將介紹如何使用PHPtrait和DTO實現一個高度可自訂的資料傳輸框架,並提供相應的程式碼範例。

這篇文章帶大家解讀vue原始碼,來介紹一下Vue2中為什麼可以使用 this 存取各種選項中的屬性,希望對大家有幫助!

PHPtraitDTO:優化資料傳輸流程的關鍵工具,需要具體程式碼範例在開發過程中,資料的傳輸是一個十分關鍵的環節。如何有效率地傳輸數據,成為了開發者需要解決的難題之一。 PHP語言中,使用traitDTO(DataTransferObject)可以優化資料傳輸流程,提高資料傳輸的效率。本文將介紹什麼是traitDTO,以及如何使用它來最佳化資料傳輸流

PHPtraitDTO:優雅的資料傳輸物件模式概述:資料傳輸物件(DataTransferObject,簡稱DTO)是一種設計模式,用於在不同層之間傳輸資料。在應用程式中,經常需要從資料庫或外部服務獲取數據,並在應用程式的不同層之間進行傳遞。 DTO模式可以讓資料傳輸更加簡潔、清晰,同時也便於擴展與維護。在PHP中,我們可以使用trait來實現DTO
