前言
之前的一個同事換工作,在面試被問到了 PHP 的 trait 。因為沒用過, 所以沒答好,我大概是用過幾次的,想了想整理了以下的總結。
trait
trait 是在一些類別(Class)的應該具備的特定的屬性或方法,而同父級的另外一些類別應該避免包含這些屬性和方法情況下使用的.
當然, 這也和開發者對類別的抽象能力有關, 有些抽象能力好的, 可以減少對trait 的使用但是這種情況應該是無法避免的不然trait出現就毫無意義了.
還有一種情況, 就是使用trait 的時候, 可以起到的約束開發者的作用, 提醒開發者註意需要在開發的過程中調用trait 的某些屬性和方法.
同事則提出了一個好問題, 介面(interface) 不也是這個作用麼?
不急, 讓我們先看個例子:
例如你要收集網站上各類資料, 開發了Spider 類別. Spider
有個方法叫 request()
負責請求.
<?php namespace XWSoul\Network; class Spider { public function request($url) { //do sth. } }
但是採集資料的過程中, 有些網站對蜘蛛敏感有些則不. 對於敏感的網站, 我們給出了一個使用代理的解決方案. 但是使用代理是會影響抓取速度的. 這就產生了Spider 的子類別有些需要用代理, 而能不用代理則盡量不用的情況.
於是這個時候我們新增了一個trait Proxy:
<?php namespace XWSoul\Network; trait Proxy { protected $isProxy = false; public function useProxy($proxy) { //do sth proxy setups. $this->isProxy = true; return $this; } public function request($url) { if (!$this->isProxy) { throw new Exception("Please using proxy."); } //do sth. return parent::request($url); } }
trait 重寫了Spider 的request()
方法, 限定了在沒有呼叫代理的情況下呼叫會拋出例外.
回到之前的問題, trait 這樣的用法和接口(interface) 有什麼區別?
接口的約束是前置的是定義初始就必須實現的, 他可以約束方法的實作卻無法約束方法的呼叫, trait 是一種後置的呼叫, 他已經實現了方法, 關鍵的是, 他只對調用了自身的類產生約束(廢話一句), 而對沒有調用自身的類別不產生影響(再一句廢話), 同時他是可復用的, 而且沒有破壞Spider 類別自身的實現增加, Spider 還是那個Spider.
我想trait 的用法再這裡已經很有效了吧.
後話
有人可能決定另外實作一個request 例如叫, proxyRequst 不就完了麼? 你說的好有道理…然是如果我使用了不一樣的代理具體對請求上有細節差異怎麼辦呢? 在代碼裡不停的if if if 麼? trait 如此清爽的方案為何要放棄呢?
更多PHP中的trait相關文章請關注PHP中文網!

DependencyInjection(DI)inPHPenhancescodeflexibilityandtestabilitybydecouplingdependencycreationfromusage.ToimplementDIeffectively:1)UseDIcontainersjudiciouslytoavoidover-engineering.2)Avoidconstructoroverloadbylimitingdependenciestothreeorfour.3)Adhe

到Improveyourphpwebsite的實力,UsEthestertate:1)emplastOpCodeCachingWithOpcachetCachetOspeedUpScriptInterpretation.2)優化的atabasequesquesquesquelies berselectingOnlynlynnellynnessaryfields.3)usecachingsystemssslikeremememememcachedisemcachedtoredtoredtoredsatabaseloadch.4)

是的,ItispossibletosendMassemailswithp.1)uselibrarieslikeLikePhpMailerorSwiftMailerForeffitedEmailsending.2)enasledeLaysBetenemailstoavoidSpamflagssspamflags.3))

DependencyInjection(DI)inPHPisadesignpatternthatachievesInversionofControl(IoC)byallowingdependenciestobeinjectedintoclasses,enhancingmodularity,testability,andflexibility.DIdecouplesclassesfromspecificimplementations,makingcodemoremanageableandadapt

使用PHP發送電子郵件的最佳方法包括:1.使用PHP的mail()函數進行基本發送;2.使用PHPMailer庫發送更複雜的HTML郵件;3.使用SendGrid等事務性郵件服務提高可靠性和分析能力。通過這些方法,可以確保郵件不僅到達收件箱,還能吸引收件人。

計算PHP多維數組的元素總數可以使用遞歸或迭代方法。 1.遞歸方法通過遍歷數組並遞歸處理嵌套數組來計數。 2.迭代方法使用棧來模擬遞歸,避免深度問題。 3.array_walk_recursive函數也能實現,但需手動計數。

在PHP中,do-while循環的特點是保證循環體至少執行一次,然後再根據條件決定是否繼續循環。 1)它在條件檢查之前執行循環體,適合需要確保操作至少執行一次的場景,如用戶輸入驗證和菜單系統。 2)然而,do-while循環的語法可能導致新手困惑,且可能增加不必要的性能開銷。

在PHP中高效地哈希字符串可以使用以下方法:1.使用md5函數進行快速哈希,但不適合密碼存儲。 2.使用sha256函數提高安全性。 3.使用password_hash函數處理密碼,提供最高安全性和便捷性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。