簡(jiǎn)單談?wù)凱HP中的trait
前言
之前的一個(gè)同事?lián)Q工作,在面試被問(wèn)到了 PHP 的 trait 。因?yàn)闆](méi)用過(guò), 所以沒(méi)答好,我大概是用過(guò)幾次的,想了想整理了以下的總結(jié)。
trait
trait 是在一些類(lèi)(Class)的應(yīng)該具備的特定的屬性或方法,而同父級(jí)的另外一些類(lèi)應(yīng)該避免包含這些屬性和方法情況下使用的.
當(dāng)然, 這也和開(kāi)發(fā)者對(duì)類(lèi)的抽象能力有關(guān), 有些抽象能力好的, 可以減少對(duì) trait 的使用 但是這種情況應(yīng)該是無(wú)法避免的 不然 trait 出現(xiàn)就毫無(wú)意義了.
還有一種情況, 就是使用 trait 的時(shí)候, 可以起到的約束開(kāi)發(fā)者的作用, 提醒開(kāi)發(fā)者注意需要在開(kāi)發(fā)的過(guò)程中調(diào)用 trait 的某些屬性和方法.
同事則提出了一個(gè)好問(wèn)題, 接口(interface) 不也是這個(gè)作用么?
不急, 讓我們先看個(gè)例子:
比如你要收集網(wǎng)站上各類(lèi)數(shù)據(jù), 開(kāi)發(fā)了 Spider 類(lèi). Spider
有個(gè)方法叫 request()
負(fù)責(zé)請(qǐng)求.
<?php namespace XWSoul\Network; class Spider { public function request($url) { //do sth. } }
但是采集數(shù)據(jù)的過(guò)程中, 有些網(wǎng)站對(duì)蜘蛛敏感有些則不. 對(duì)于敏感的網(wǎng)站, 我們給出了一個(gè)使用代理的解決方案. 但是使用代理是會(huì)影響抓取速度的. 這就產(chǎn)生了 Spider 的子類(lèi)有些需要用代理, 而能不用代理則盡量不用的情況.
于是這個(gè)時(shí)候我們新增了一個(gè) 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 重寫(xiě)了 Spider 的 request()
方法, 限定了在沒(méi)有調(diào)用代理的情況下調(diào)用會(huì)拋出異常.
回到之前的問(wèn)題, trait 這樣的用法和 接口(interface) 有什么區(qū)別?
接口的約束是前置的是定義初始就必須實(shí)現(xiàn)的, 他可以約束方法的實(shí)現(xiàn)卻無(wú)法約束方法的調(diào)用, trait 是一種后置的調(diào)用, 他已經(jīng)實(shí)現(xiàn)了方法, 關(guān)鍵的是, 他只對(duì)調(diào)用了自身的類(lèi)產(chǎn)生約束(廢話(huà)一句), 而對(duì)沒(méi)有調(diào)用自身的類(lèi)不產(chǎn)生影響(再一句廢話(huà)), 同時(shí)他是可復(fù)用的, 而且沒(méi)有破壞 Spider 類(lèi)自身的實(shí)現(xiàn)增加, Spider 還是那個(gè) Spider.
我想 trait 的用法再這里已經(jīng)很有效了吧.
后話(huà)
有人可能決定 另外實(shí)現(xiàn)一個(gè) request 比如叫, proxyRequst 不就完了么? 你說(shuō)的好有道理…然是如果我使用了不一樣的 代理具體對(duì)請(qǐng)求上有細(xì)節(jié)差異怎么辦呢? 在代碼里不停的 if if if 么? trait 如此清爽的方案 為何要放棄呢?
總結(jié)
好了,以上就是這篇文章的全部?jī)?nèi)容了希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- PHP 實(shí)現(xiàn)代碼復(fù)用的一個(gè)方法 traits新特性
- PHP中的Trait 特性及作用
- PHP中trait使用方法詳細(xì)介紹
- 淺談PHP中的Trait使用方法
- PHP中Trait及其應(yīng)用詳解
- PHP中的traits實(shí)現(xiàn)代碼復(fù)用使用實(shí)例
- PHP Trait代碼復(fù)用類(lèi)與多繼承實(shí)現(xiàn)方法詳解
- 詳解PHP神奇又有用的Trait
- php 5.4 全新的代碼復(fù)用Trait詳解
- PHP的Trait機(jī)制原理與用法分析
- PHP中用Trait封裝單例模式的實(shí)現(xiàn)
- PHP Trait功能與用法實(shí)例分析
相關(guān)文章
PHP面向?qū)ο蟪绦蛟O(shè)計(jì)__tostring()和__invoke()用法分析
這篇文章主要介紹了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)__tostring()和__invoke()用法,結(jié)合實(shí)例形式分析了__tostring()和__invoke()功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-06-06PHP向?yàn)g覽器輸出內(nèi)容的4個(gè)函數(shù)總結(jié)
這篇文章主要介紹了PHP向?yàn)g覽器輸出內(nèi)容的4個(gè)函數(shù)總結(jié),本文總結(jié)的就是print()、echo()、printf()、sprintf()這4個(gè)輸出函數(shù),需要的朋友可以參考下2014-11-11PHP調(diào)用Twitter的RSS的實(shí)現(xiàn)代碼
“守望軒”博客右側(cè)邊欄原來(lái)有個(gè)“雜感”的欄目,用來(lái)記錄短的、不能大篇幅成文的短句,或者自己比較喜歡的短句和言論。2010-03-03PHP提示Notice: Undefined variable的解決辦法
今天在調(diào)試程序的時(shí)候,很多網(wǎng)上提供的源碼都會(huì)出現(xiàn) Undefined variable錯(cuò)誤,一般情況下php是不需要定義變量的,但如果服務(wù)器什么都報(bào)錯(cuò)的,就會(huì)出現(xiàn)錯(cuò)誤,所以服務(wù)器上都是應(yīng)該屏蔽這種錯(cuò)誤的2012-11-11php中數(shù)據(jù)庫(kù)連接方式pdo和mysqli對(duì)比分析
這篇文章主要介紹了php中數(shù)據(jù)庫(kù)連接方式pdo和mysqli從各個(gè)方面進(jìn)行了對(duì)比分析,十分全面,這里推薦給大家,有需要的小伙伴來(lái)參考下。2015-02-02