PHP 中的Trait

来源:https://www.cnblogs.com/hujingnb/archive/2019/03/17/10549691.html
-Advertisement-
Play Games

概述 在PHP中有一種代碼復用的技術, 因為單繼承的問題, 有些公共方法無法在父類中寫出, 而 Trait可以應對這種情況, 它可以定義一些復用的方法, 然後在你需要使用的類中將其引入即可. 剛開始的時候給我的感覺就是將trait代碼塊直接拿到類中的意思, 但後來我發現, 我太天真了. PHP中的T ...


概述

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

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

PHP中的Trait用法: 

問題

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

  1. 能否引入多個, 如果可以的話, 同名方法如何處理
  2. 引入方法與現有方法重名時, 如何解決
  3. 能否定義抽象方法, 因為有些方法需要知道使用時的情況, 在抽象類中, 這種情況一般通過調用抽象方法來解決
  4. 能否定義欄位
  5. 能否將欄位或方法定義為靜態
  6. 能否對方法進行許可權控制

答疑

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

 

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

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

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

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

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

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

總結

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

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

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

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

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

嗯, 以上就是我的初步理解, 拙見. 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GitHub代碼練習地址:1.兩種簡單get請求方法:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac13_requests1.py 2.帶請求頭與參數的get請求:https://github.com/Neo-ML/Py ...
  • 今天想做一個微博爬個人頁面的工具,滿足一些不可告人的秘密。那麼首先就要做那件必做之事!模擬登陸…… 關註公眾號「**Python專欄**」,後臺回覆「**模擬微博登陸**」,獲取全套微博自動登陸代碼。 ...
  • GitHub代碼練習地址:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac12_ajax.py 瞭解ajax 是一種非同步請求 一定會有url,請求方法,可能有數據 一般使用json格式 案例,爬取部分豆瓣電影排行榜, 代碼 ...
  • π的計算 一、π的簡介 π的介紹 圓周率用希臘字母 π(讀作pài)表示,是一個常數(約等於3.141592654),是代表圓周長和直徑的比值。它是一個即無限不迴圈小數,在日常生活中,通常都用3.14代表圓周率去進行近似計算。 π的求解歷程 1965年,英國數學家約翰·沃利斯(John Wallis ...
  • python中的猴子補丁Monkey Patch 什麼是猴子補丁 the term monkey patch only refers to dynamic modifications of a class or module at runtime, motivated by the intent t ...
  • Java數據結構-HashMap 1. HashMap數據結構 沒有哈希衝突時,為數組,支持動態擴容 哈希衝突時,分為兩種情況: 1. 當衝突長度小於8或數組長度小於64(MIN_TREEIFY_CAPACITY預設值為64)時,為數組+鏈表(Node) 2. 當衝突長度大於8時,為數組+紅黑樹/鏈 ...
  • 作為一個有多年PHP開發經驗的碼農,我也是前段時間才發現PHP處理數組有這麼好用的函數, 至此之前,我處理數組的數據基本都是使用迴圈,記錄一下兩個函數的用法: array_column() 函數 返回輸入數組中某個單一列的值。 語法: array_column(array,column_key,in ...
  • 基於Cmake、QT Creator、Visual Studio的C++項目構建、開發、編譯是初學者必要的工具,本文主要介紹這些工具的下載與安裝,以及C++及Qt項目構建,主要包括 1.基於VS構建Qt項目;2.基於Qt Creater構建,在VS中開發Qt Creater生成的項目;3.基於Cma... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...