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

首頁 > 網(wǎng)站 > 幫助中心 > 正文

PHP延遲靜態(tài)綁定的深入講解

2024-07-09 22:40:40
字體:
供稿:網(wǎng)友

前言

所謂延遲靜態(tài)綁定,顧名思義,靜態(tài)調(diào)用時::符號左側(cè)的部分的的綁定是延遲,也就是說不再被解析為定義當(dāng)前方法所在的類,而是在實際運(yùn)行時計算的。本文主要介紹了關(guān)于PHP延遲靜態(tài)綁定的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧。

嗅到了壞的味道

這段時間看項目后臺的PHP代碼,看到了類似于以下的一段代碼,我把它抽出來:

<?php class DBHandler {  function get() {} } class MySQLHandler extends DBHandler {  // 這里一個create  public static function create() {   echo "MySQL";   return new self();  }  public function get() {   echo "MySQL get()";  } } class MemcachedHandler extends DBHandler {  // 這里又有一個create  public static function create() {   echo "Memcached";   return new self();  }  public function get() {   echo "Memcached get";  } } function get(DBHandler $handler) {  $handler->get(); } $dbHandler = MySQLHandler::create(); get($dbHandler);?>

有沒有嗅到壞代碼的味道?可以看到,在MySQLHandler和MemcachedHandler類中,都有一個create函數(shù),除掉我的輸出語句,發(fā)現(xiàn)它們一模一樣,這就是代碼冗余。是的,需要進(jìn)行代碼重構(gòu)。

進(jìn)行簡單的重構(gòu)

代碼重構(gòu)無處不在,只要你想,你覺的有改進(jìn),就需要敲起鍵盤開始干活。來吧,對上面的代碼進(jìn)行重構(gòu),如下:

<?php class DBHandler {  public static function create() {   echo "create";   return new self();  }  function get() {} } class MySQLHandler extends DBHandler {  public function get() {   echo "MySQL get()";  } } class MemcachedHandler extends DBHandler {  public function get() {   echo "Memcached get";  } } function get(DBHandler $handler) {  $handler->get(); } $dbHandler = MySQLHandler::create(); get($dbHandler);?>

將create函數(shù)移到DBHandler類中,看起來還不錯,至少少了一坨那糟糕的代碼。

貌似是錯的

運(yùn)行一下,卻發(fā)現(xiàn),并沒有打印出我們期望的 MySQL get()  。什么情況?這說明,并沒有調(diào)用MySQLHandler的get函數(shù),但是代碼明明調(diào)用了啊,這說明, new self() 這句代碼有問題。這有什么問題?這就需要說到今天總結(jié)的重點了――――延遲靜態(tài)綁定。

延遲靜態(tài)綁定

在PHP5.3以后引入了延遲靜態(tài)綁定。再看下面這段代碼:

<?php class A {  public static function who() {   echo __CLASS__;  }  public static function test() {   self::who();  } } class B extends A {  public static function who() {   echo __CLASS__;  } } B::test();?>

上面的代碼輸出了A,但是我希望它輸出B,這就是問題的所在。這也是 self 和 __CLASS__ 的限制。使用 self:: 或者 __CLASS__ 對當(dāng)前類的靜態(tài)引用,取決于定義當(dāng)前方法所在的類。所以,這就很好的解釋了為什么上面的代碼輸出了A。但是,如果我們需要輸出B呢?可以這么干:

<?php class A {  public static function who() {   echo __CLASS__;  }  public static function test() {   static::who(); // 這里有變化,后期靜態(tài)綁定從這里開始  } } class B extends A {  public static function who() {   echo __CLASS__;  } } B::test();?>
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜川县| 河南省| 天等县| 简阳市| 许昌市| 尼玛县| 溧水县| 定安县| 峨眉山市| 中牟县| 满城县| 唐海县| 绥化市| 蚌埠市| 保康县| 嘉兴市| 修水县| 浦城县| 杂多县| 团风县| 阿巴嘎旗| 扶绥县| 葫芦岛市| 太保市| 虹口区| 华蓥市| 清原| 泰州市| 仁寿县| 镶黄旗| 依安县| 武夷山市| 绩溪县| 平遥县| 张家口市| 安宁市| 祥云县| 根河市| 仙游县| 碌曲县| 东阳市|