自PHP5.4.0起,PHP實作了一種程式碼重複使用的方法,稱為Trait。因為PHP是單一繼承,當你需要多個區別的特性,就不得不去組合多個基類,Trait出現後就避免了這些問題,Trait的優勢就是可以隨意組合,而且代碼清晰。本文主要介紹了關於PHP中的trait,需要的朋友可以參考下。
前言
之前的一個同事換工作,在面試被問到了 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.
後話
有人可能決定另外實作一個request 例如叫, proxyRequst 不就完了麼? 你說的好有道理…然是如果我使用了不一樣的代理具體對請求上有細節差異怎麼辦呢? 在代碼裡不停的if if if 麼? trait 如此清爽的方案為何要放棄呢?
以上是php中trait定義用法和介面的區別詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

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

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

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