国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

簡單談談PHP中的trait

2024-05-04 21:50:04
字體:
來源:轉載
供稿:網友

前言:之前的一個同事換工作,在面試被問到了 PHP 的 trait 。因為沒用過, 所以沒答好,我大概是用過幾次的,想了想整理了以下的總結。

trait:trait 是在一些類(Class)的應該具備的特定的屬性或方法,而同父級的另外一些類應該避免包含這些屬性和方法情況下使用的.

當然, 這也和開發者對類的抽象能力有關, 有些抽象能力好的, 可以減少對 trait 的使用 但是這種情況應該是無法避免的 不然 trait 出現就毫無意義了.

還有一種情況, 就是使用 trait 的時候, 可以起到的約束開發者的作用, 提醒開發者注意需要在開發的過程中調用 trait 的某些屬性和方法.

同事則提出了一個好問題, 接口(interface) 不也是這個作用么?

不急, 讓我們先看個例子:

比如你要收集網站上各類數據, 開發了 Spider 類. Spider有個方法叫request()負責請求.

  1. namespaceXWSoul/Network; 
  2. classSpider 
  3.  publicfunctionrequest($url
  4.  { 
  5.  //do sth. 
  6.  } 

但是采集數據的過程中, 有些網站對蜘蛛敏感有些則不. 對于敏感的網站, 我們給出了一個使用代理的解決方案. 但是使用代理是會影響抓取速度的. 這就產生了 Spider 的子類有些需要用代理, 而能不用代理則盡量不用的情況.

于是這個時候我們新增了一個 trait Proxy:

  1. namespaceXWSoul/Network; 
  2. trait Proxy 
  3.   
  4.  protected$isProxy= false; 
  5.   
  6.  publicfunctionuseProxy($proxy
  7.  { 
  8.  //do sth proxy setups. 
  9.  $this->isProxy = true; 
  10.  return$this
  11.  } 
  12.   
  13.  publicfunctionrequest($url
  14.  { 
  15.  if(!$this->isProxy) { 
  16.   thrownewException("Please using proxy."); 
  17.  } 
  18.  //do sth. 
  19.  returnparent::request($url); 
  20.  } 

trait 重寫了 Spider 的request()方法, 限定了在沒有調用代理的情況下調用會拋出異常.

回到之前的問題, trait 這樣的用法和 接口(interface) 有什么區別?

接口的約束是前置的是定義初始就必須實現的, 他可以約束方法的實現卻無法約束方法的調用, trait 是一種后置的調用, 他已經實現了方法,  關鍵的是, 他只對調用了自身的類產生約束(廢話一句), 而對沒有調用自身的類不產生影響(再一句廢話), 同時他是可復用的, 而且沒有破壞  Spider 類自身的實現增加, Spider 還是那個 Spider.

我想 trait 的用法再這里已經很有效了吧.

后話:

有人可能決定 另外實現一個 request 比如叫, proxyRequst 不就完了么? 你說的好有道理…然是如果我使用了不一樣的 代理具體對請求上有細節差異怎么辦呢? 在代碼里不停的 if if if 么? trait 如此清爽的方案 為何要放棄呢?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 卢龙县| 寿阳县| 阜南县| 儋州市| 丽水市| 丰镇市| 安岳县| 奉化市| 息烽县| 长阳| 项城市| 灵台县| 开封市| 平顶山市| 伊宁县| 剑川县| 旺苍县| 涪陵区| 西林县| 华容县| 泰安市| 敦化市| 新巴尔虎右旗| 阿拉善左旗| 庄浪县| 邮箱| 阿荣旗| 伊金霍洛旗| 彰武县| 玉环县| 汤原县| 无锡市| 高台县| 贡嘎县| 静宁县| 阿巴嘎旗| 丰顺县| 定州市| 靖宇县| 两当县| 和顺县|