也可以影響參數(shù)的作用域。
Closure::bindTo
bindTo和bind功能類(lèi)似,這里只是另外一種形式,都是復(fù)制當(dāng)前閉包對(duì)象,綁定指定的$this對(duì)象和類(lèi)作用域。,參數(shù)比bind少了第一個(gè),
后面兩個(gè)一樣,當(dāng)然還有一個(gè)區(qū)別就是bindTo不是靜態(tài)方法,是閉包才會(huì)存在的一個(gè)屬性方法。
例子
<?phpclass T { private function show() { echo "我是T里面的私有函數(shù):show\\\\n"; } protected function who() { echo "我是T里面的保護(hù)函數(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的類(lèi)似
我是T里面的私有函數(shù):show我是T里面的保護(hù)函數(shù):who我是T里面的公共函數(shù):name
一個(gè)trick
這個(gè)函數(shù)是在看composer生成的自動(dòng)加載源碼的時(shí)候碰到的,在composer中用的比較特別,下面是截取部分composer中的代碼
// 文件autoload_real.phpcall_user_func(\\\\Composer\\\\Autoload\\\\ComposerStaticInit898ad46cb49e20577400c63254121bac::getInitializer($loader));// 文件autoload_static.phppublic 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中,第一感覺(jué)是傳錯(cuò)參數(shù)了,其實(shí)不然,這里調(diào)用了一個(gè)函數(shù),這個(gè)函數(shù)會(huì)返回一個(gè)Closure對(duì)象,
也就是一個(gè)匿名函數(shù),最終傳入的參數(shù)還是一個(gè)callable類(lèi)型。再看看這個(gè)返回的閉包,里面使用了use,這是連接閉包和外部變量的橋梁。
至于這里為什么普通傳參數(shù)就可以,是因?yàn)閜hp5里面,對(duì)象形參和實(shí)參數(shù)指向相同的對(duì)象,函數(shù)里面對(duì)對(duì)象的修改會(huì)反映到對(duì)象外面。
所以,上面這么做是沒(méi)問(wèn)題的,還有另外一種形式也可以
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);}
總結(jié)
好長(zhǎng)時(shí)間沒(méi)寫(xiě)blog了,有時(shí)候太煩躁,靜不下心來(lái),有時(shí)又有沒(méi)有找到想寫(xiě)的東西。還是得靜下心來(lái),好好做好每一件事,遇事情不要煩躁,心放大,心平氣和的處理每一件事。
相關(guān)教程推薦:《PHP教程》
更多關(guān)于云服務(wù)器,域名注冊(cè),虛擬主機(jī)的問(wèn)題,請(qǐng)?jiān)L問(wèn)西部數(shù)碼官網(wǎng):m.ps-sw.cn