網(wǎng)摘----轉(zhuǎn)
1轧苫、基礎(chǔ):一句話實(shí)現(xiàn)定義一個(gè)函數(shù)并立即調(diào)用大家在JavaScript里經(jīng)常這么搞樟遣,因?yàn)樽兞课廴臼莻€(gè)不可容忍的事兒茧妒。但是PHP里如何實(shí)現(xiàn)這樣的功能酬蹋?一個(gè)可行方法是:call_user_func(function(){ echo "hello,world";});
2及老、上下文變量在1的基礎(chǔ)上,來(lái)個(gè)有意思的:用一個(gè)匿名函數(shù)當(dāng)做匿名空間范抓,同時(shí)調(diào)用外部上下文變量:$context="hello,world";call_user_func(function()use($context){echo $context;});
等下骄恶,有沒(méi)有覺(jué)得這context的叫法有點(diǎn)像Django的感覺(jué)?嗯匕垫,完全可以利用這個(gè)方法可以包裝出一個(gè)通用的視圖方法僧鲁,但是use不能和$this直接聯(lián)用,怎么辦?既然這個(gè)($this)不讓用,就用那個(gè)($that)寞秃。參見(jiàn)第三條斟叼。
3、 use和$this在2的基礎(chǔ)之上春寿,更強(qiáng)大的用法(use當(dāng)前類對(duì)象的引用)朗涩。class Contrller {//...其他方法public function view($template_name,$context=NULL,$isShow=true){ ob_start(); $that=$this; //注意$this不能直接用于use call_user_func( //這里可以向視圖文件傳入?yún)?shù) function()use($that,$template_name,$context){ $view_path=$that->getViewPath($template_name); include $view_path; } } $out=ob_get_contents(); ob_end_clean(); if($isShow){ echo $out; }else{ return $out; }} }
事實(shí)上,這個(gè)例子用的做作了绑改,PHP5.3之后適用谢床。經(jīng) @張明同學(xué)提醒,自PHP5.4之后绢淀,可以無(wú)需使用use即可使用$this萤悴。官方文檔的參考鏈接PHP: Anonymous functions**ChangelogVersion Description **5.4.0**** $this can be used in anonymous functions. **5.3.0 Anonymous functions become available.
這真是件大快人心的大好事瘾腰!測(cè)試demo如下:class A { public $t; public function __construct($t="hello,world"){ $this->t=$t; } function test(){ call_user_func(function(){ echo $this->t; }); } } $a=new A(); $a->test();
所以皆的,對(duì)于高版本的PHP,就不用搞個(gè)$that了蹋盆。剛剛?cè)ニ蚜讼孪嚓P(guān)問(wèn)題费薄,stackoverflow上這組問(wèn)答非常值得參考,今天才發(fā)現(xiàn)栖雾,罪過(guò)罪過(guò):php - Using $this in anonymous function**又去翻了下文檔楞抡,有了這個(gè)特性之后,類似JavaScript里apply之類的this劫持也可以實(shí)現(xiàn)了析藕,這真是大快人心的事情召廷。
4、碉堡了的特性:調(diào)用那個(gè)可調(diào)用的東西調(diào)用一切可調(diào)用的東西账胧,不只是你自定義的函數(shù)竞慢。簡(jiǎn)單例子:把這個(gè)用于實(shí)現(xiàn)一個(gè)通用控制器。class Contrller{ //調(diào)用具體的action治泥, public function __act($action){ call_user_func( array($this,$action) ); }}class HelloContrller extends Controller{ public function index(){ } public function hello(){ } public function dance(){ }}