您好,登錄后才能下訂單哦!
這篇文章給大家介紹trait函數怎么在PHP中使用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
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函數怎么在PHP中使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。