久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP基于Closure類創(chuàng)建匿名函數的方法詳解

這篇文章主要介紹了PHP基于Closure類創(chuàng)建匿名函數的方法,結合實例形式詳細分析了Closure 類的功能、常用函數使用技巧及相關注意事項,需要的朋友可以參考下

本文實例講述了PHP基于Closure類創(chuàng)建匿名函數的方法。分享給大家供大家參考,具體如下:

Closure 類

用于代表匿名函數的類。

匿名函數(在 PHP 5.3 中被引入)會產生這個類型的對象。在過去,這個類被認為是一個實現細節(jié),但現在可以依賴它做一些事情。自 PHP 5.4 起,這個類帶有一些方法,允許在匿名函數創(chuàng)建后對其進行更多的控制。

這個類不能實例化,里面主要有兩個方法,都用來復制閉包,一個靜態(tài)一個動態(tài),下面分別詳細講解下這兩個不好理解的方法。

Closure::bind

public static Closure Closure::bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] )

參數說明:

closure
需要綁定的匿名函數。

newthis
需要綁定到匿名函數的對象,或者 NULL 創(chuàng)建未綁定的閉包。

newscope
想要綁定給閉包的類作用域,或者 'static' 表示不改變。如果傳入一個對象,則使用這個對象的類型名。 類作用域用來決定在閉包中 $this 對象的 私有、保護方法 的可見性。

The class scope to which associate the closure is to be associated, or 'static' to keep the current one. If an object is given, the type of the object will be used instead. This determines the visibility of protected and private methods of the bound object.

上面是該方法的定義,第一個參數很好理解,就是一個閉包函數;第二個參數就不太好理解,如果要復制的閉包中包含$this,這個對象就表示這個$this,閉包函數里面對這個對象的修改在調用結束之后也會保持一致,比如修改了一個屬性;第三個參數就不太好理解了,看官方的說明也是云里霧里的,默認參數情況下,調用$this->訪問object $newthis中的屬性函數的時候,會有限制,只能訪問public屬性的函數,如果想訪問protected/private屬性,就要設置為對應的類名/類實例,就要像在類里面一樣,要訪問那個類的保護/私有屬性函數。

例子

<?php
class T {
  private function show()
  {
    echo "我是T里面的私有函數:show\n";
  }
  protected function who()
  {
    echo "我是T里面的保護函數:who\n";
  }
  public function name()
  {
    echo "我是T里面的公共函數:name\n";
  }
}
$test = new T();
$func = Closure::bind(function(){
  $this->who();
  $this->name();
  $this->show();
}, $test);
$func();

上面的代碼會報錯Fatal error: Uncaught Error: Call to protected method T::who() from context 'Closure'

加上bind第三個參數為t::class或者new T(),會正常輸出每一個結果。

我是T里面的保護函數:who
我是T里面的公共函數:name
我是T里面的私有函數:show

當然了,閉包也可以傳遞參數

$test = new StdClass();
var_dump($test);
$func = Closure::bind(function($obj){
  $obj->name = "燕睿濤";
}, null);
$func($test);
var_dump($test);

上面的程序跟匿名函數一樣,啥對象也沒有依賴,上面的程序會輸出:

object(stdClass)#1 (0) {
}
object(stdClass)#1 (1) {
 ["name"]=>
 string(9) "燕睿濤"
}

另外還有個特別要說明的例子

<?php
class T {
  private function show()
  {
    echo "我是T里面的私有函數:show\n";
  }
  protected function who()
  {
    echo "我是T里面的保護函數:who\n";
  }
  public function name()
  {
    echo "我是T里面的公共函數:name\n";
  }
}
$func = Closure::bind(function ($obj) {
  $obj->show();
}, null);
$test = new T();
$func($test);

上面的情況會輸出什么呢,沒錯,會報錯,提示訪問不了私有屬性show,這個時候,加上第三個參數就可以了,看了第三個參數不光影響$this的作用域,也可以影響參數的作用域。

Closure::bindTo

bindTo和bind功能類似,這里只是另外一種形式,都是復制當前閉包對象,綁定指定的$this對象和類作用域。,參數比bind少了第一個,后面兩個一樣,當然還有一個區(qū)別就是bindTo不是靜態(tài)方法,是閉包才會存在的一個屬性方法。

例子

<?php
class T {
  private function show()
  {
    echo "我是T里面的私有函數:show\n";
  }
  protected function who()
  {
    echo "我是T里面的保護函數:who\n";
  }
  public function name()
  {
    echo "我是T里面的公共函數:name\n";
  }
}
$func = function () {
  $this->show();
  $this->who();
  $this->name();
};
$funcNew = $func->bindTo(new T(), T::class);
$funcNew();

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業(yè)用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發(fā)接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 在线国产99 | 欧美韩一区二区三区 | 欧美黑人巨大videos精品 | 国产精品特级片 | 成人免费一区二区 | 欧美日韩在线视频一区 | 欧美日韩1区2区3区 欧美久久一区 | 欧美激情综合 | 久久69精品久久久久久国产越南 | 国产免费黄网 | 成年男女免费视频网站 | 日本小电影在线 | 久草网站 | 精品熟人一区二区三区四区 | 91不卡| 日韩一区和二区 | 亚洲欧美国产视频 | 中文字幕视频在线观看 | 91 久久| 国产成人福利在线观看 | 欧美自拍一区 | 亚洲第一视频网 | 亚洲精品视频网站在线观看 | 久久激情网| 中文字幕亚洲精品 | 91不卡| 欧美日本韩国一区二区三区 | 精品久久久久久一区二区 | 欧美一区二区三区久久精品 | 国产精品91视频 | 欧美日韩国产在线观看 | 亚洲一级毛片 | 精精国产xxxx视频在线播放 | 久久久青草婷婷精品综合日韩 | 久草新在线 | 国内久久 | 一区二区在线不卡 | 日韩无 | 日日夜夜精品 | 色综合网站 | 久草成人网 |