欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP中怎么使用Closure類-創(chuàng)新互聯(lián)

小編給大家分享一下PHP中怎么使用Closure類,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、成縣網(wǎng)站定制設(shè)計、自適應品牌網(wǎng)站建設(shè)、html5、成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為成縣等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

Closure 類

用于代表匿名函數(shù)的類。

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

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

Closure::bind

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

參數(shù)說明:
closure
需要綁定的匿名函數(shù)。

newthis
需要綁定到匿名函數(shù)的對象,或者 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.

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

例子
<?php
class T {
    private function show()
    {
        echo "我是T里面的私有函數(shù):show\n";
    }

    protected  function who()
    {
        echo "我是T里面的保護函數(shù):who\n";
    }

    public function name()
    {
        echo "我是T里面的公共函數(shù):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第三個參數(shù)為t::class或者new T(),會正常輸出每一個結(jié)果。

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

當然了,閉包也可以傳遞參數(shù)

$test = new StdClass();
var_dump($test);

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

$func($test);
var_dump($test);

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

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

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

<?php
class T {
    private function show()
    {
        echo "我是T里面的私有函數(shù):show\n";
    }

    protected  function who()
    {
        echo "我是T里面的保護函數(shù):who\n";
    }

    public function name()
    {
        echo "我是T里面的公共函數(shù):name\n";
    }
}

$func = Closure::bind(function ($obj) {
    $obj->show();
}, null);

$test = new T();

$func($test);

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

Closure::bindTo

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

例子
<?php
class T {
    private function show()
    {
        echo "我是T里面的私有函數(shù):show\n";
    }

    protected  function who()
    {
        echo "我是T里面的保護函數(shù):who\n";
    }

    public function name()
    {
        echo "我是T里面的公共函數(shù):name\n";
    }
}

$func = function () {
    $this->show();
    $this->who();
    $this->name();
};

$funcNew = $func->bindTo(new T(), T::class);

$funcNew();

上面函數(shù)的輸出和bind的類似

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

一個trick

這個函數(shù)是在看composer生成的自動加載源碼的時候碰到的,在composer中用的比較特別,下面是截取部分composer中的代碼

// 文件autoload_real.php
call_user_func(\Composer\Autoload\ComposerStaticInit898ad46cb49e20577400c63254121bac::getInitializer($loader));

// 文件autoload_static.php
public static function getInitializer(ClassLoader $loader)
{
    return \Closure::bind(function () use ($loader) {
        $loader->prefixLengthsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixLengthsPsr4;
        $loader->prefixDirsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixDirsPsr4;
        $loader->prefixesPsr0 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixesPsr0;
        $loader->classMap = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$classMap;

    }, null, ClassLoader::class);
}

上面的代碼比較奇特,在call_user_func中,第一感覺是傳錯參數(shù)了,其實不然,這里調(diào)用了一個函數(shù),這個函數(shù)會返回一個Closure對象,
也就是一個匿名函數(shù),最終傳入的參數(shù)還是一個callable類型。再看看這個返回的閉包,里面使用了use,這是連接閉包和外部變量的橋梁。
至于這里為什么普通傳參數(shù)就可以,是因為php5里面,對象形參和實參數(shù)指向相同的對象,函數(shù)里面對對象的修改會反映到對象外面。

所以,上面這么做是沒問題的,還有另外一種形式也可以

call_user_func(\Composer\Autoload\ComposerStaticInit898ad46cb49e20577400c63254121bac::getInitializer(), $loader);

public static function getInitializer()
{
    return \Closure::bind(function ($loader) {
        $loader->prefixLengthsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixLengthsPsr4;
        $loader->prefixDirsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixDirsPsr4;
        $loader->prefixesPsr0 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixesPsr0;
        $loader->classMap = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$classMap;

    }, null, ClassLoader::class);
}

以上是“PHP中怎么使用Closure類”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

新聞標題:PHP中怎么使用Closure類-創(chuàng)新互聯(lián)
本文路徑:http://aaarwkj.com/article46/ccdseg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應網(wǎng)站網(wǎng)站策劃、外貿(mào)建站虛擬主機、域名注冊、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
日韩av一区二区国产| 欧美日韩国产天堂一区| 极品美女被插到高潮喷水| 香蕉视频欧美久久精品| 日本女优中文字幕久久| 91在线国内在线观看| 日韩性视频激情在线一区| 国产一区二区传媒视频| 深夜释放自己污在线看| 在线观看视频免费午夜| 久久精品国产亚洲av不卡| 曰本真人性做爰视频免费| 国内丰满少妇嗷嗷叫在线播放| 小骚货操死你视频在线观看| 亚洲成熟中老妇女视频| 最新日韩一区二区在线| 国内自拍一区二区三区| 欧美老熟妇子乱视频在线| 日本韩国欧美在线一区| 日韩一二区不卡在线视频| 一本之道久久成人综合| 久久国产精品一区免费观看| 亚洲欧美日韩校园春色| 99热国产这里只有精品| 亚洲一区在线观看蜜臀| 五月婷婷丁香在线观看| 在线不卡日本v二区到六区| 国产欧美日韩一区二区三区四区| av在线中文字幕乱码| 少妇人妻精品一区三区二区| 亚洲精品啪啪一区二区| 日本亚洲一区二区在线| 厕所偷拍视频一区二区三区| 国产一级av在线播放| 四虎在线观看免费资源| 午夜剧场福利在线观看| 日韩不卡一区二区在线观看| 国产午夜福利片新视觉| 97人妻精品一区二区三区六| 国产精品久久护士96| 久草福利在线观看免费|