淺談 PHP 中的 Trait 使用方法,報錯如何解決

wangchunbo發表於2019-12-20

在PHP中有一種程式碼複用的技術, 因為單繼承的問題, 有些公共方法無法在父類中寫出, 而 Trait可以應對這種情況, 它可以定義一些複用的方法, 然後在你需要使用的類中將其引入即可.

剛開始的時候給我的感覺就是將trait程式碼塊直接拿到類中的意思, 但後來我發現, 我太天真了.

Trait 是為類似 PHP 的單繼承語言而準備的一種程式碼複用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中複用 method。Trait 和 Class 組合的語義定義了一種減少複雜性的方式,避免傳統多繼承和 Mixin 類相關典型問題。

Trait 和 Class 相似,但僅僅旨在用細粒度和一致的方式來組合功能。 無法透過 trait 自身來例項化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個 Class 之間不需要繼承。

PHP中的Trait用法:

Laravel

當我第一次使用的時候, 因為之前一直使用抽象類, 或者定義內部物件, 然後呼叫內部物件中的方法, 所以我當時有了以下幾個問題:

1.能否引入多個, 如果可以的話, 同名方法如何處理

2.引入方法與現有方法重名時, 如何解決

3.能否定義抽象方法, 因為有些方法需要知道使用時的情況, 在抽象類中, 這種情況一般透過呼叫抽象方法來解決

4.能否定義欄位

5.能否將欄位或方法定義為靜態

6.能否對方法進行許可權控制

  1. Trait 可以引入多個, 多個trait中存在同名方法時, 需要指定使用哪個方法, 如下:

Laravel

2.引入方法與現有方法重名時, 會優先呼叫類中已定義的方法, 其優先順序順序為: 當前類方法>trait方法>父類方法

  1. trait 中可以定義抽象方法, 語法與抽象類相同

Laravel

4.trait 中可以定義欄位, 語法與類相同

Laravel

  1. 可以定義靜態方法與靜態欄位

Laravel

  1. 可以進行方法許可權的控制

Laravel

  1. 另外, 在trait 程式碼塊中還可以引入其他trait程式碼塊, 語法與類中引入相同:

Laravel

至此, 我發現了一個新的問題, 這個 trait 與抽象類有什麼區別? 說什麼程式碼複用, 這不就是多繼承麼? trait與抽象類功能上有區別麼? 抽象類能幹的, trait都能幹啊.

思前想後, 我覺得區別還是有的, 雖然說他們兩個看著很像, 功能相似, 但是正如抽象類與介面一樣(雖然這兩者不同, 介面不能定義方法), 介面更側重於定義一組公共的方法, 一種規範, 而抽象類則側重於將子類中公共的方法進行抽離, 提高程式碼的複用.

trait 與抽象類的側重點也不相同

trait 側重於定義共用的程式碼片段, 它並不管引用此片段的類是幹什麼的, 只要你需要, 就可以拿走去用, 簡單說就是 trait 並不約束類的型別, 而僅僅定義方法

抽象類則不同, 既然你繼承我, 那你乾的事情肯定跟我是一樣的, 不能抽象類是去與資料庫互動的, 你子類去寫指令碼了. 所以抽象類相對 trait 更側重於 型別的約束.

原文連結

本作品採用《CC 協議》,轉載必須註明作者和本文連結
感謝關注 上海PHP自學中心-免費程式設計影片教學|

相關文章