欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡(jiǎn)單談?wù)凱HP中的trait

 更新時(shí)間:2017年02月25日 14:43:35   作者:虛偽的靈魂  
自PHP5.4.0起,PHP實(shí)現(xiàn)了一種代碼復(fù)用的方法,稱(chēng)為T(mén)rait。因?yàn)镻HP是單繼承,當(dāng)你需要多個(gè)區(qū)別的特性,就不得不去組合多個(gè)基類(lèi),Trait出現(xiàn)后就避免了這些問(wèn)題,Trait的優(yōu)勢(shì)就是可以隨意組合,而且代碼清晰。本文主要介紹了關(guān)于PHP中的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)大家可以留言交流。

相關(guān)文章

最新評(píng)論