一.使用闭包作为回调classCart{CONSTPRICE_BUTTER=1.0;CONSTPRICE_MILK=5.05;受保护的$products=[];publicfunctionadd($product,$quantity){$this->products[$product]=$quantity;}publicfunctiongetQuantity($product){returnisset($this->products[$product])?$this->products[$product]:false;}publicfunctiongetTotal($tax){$total=0.00;$callback=function($quantity,$product)use($tax,&$total){$priceItem=constant(__CLASS__.'::PRICE_'.strtoupper($product));}$总计+=($priceItem*$quantity)*($tax+1.0);};array_walk($this->products,$callback);返回回合($总计,2);}}$cart=newCart();$cart->add('butter',1);$cart->add('milk',5);echo$cart->getTotal(0.05);二.依据屏蔽实现一个容器classDi{private$factory;publicfunctionset($id,$value){$this->factory[$id]=$value;}publicfunctionget($id){$val=$this->factory[$id];return$val();//如果不加括号,只返回闭包类,不返回User实例}}classUser{private$username;公共函数__construct($username=''){$this->username=$username;}publicfunctiongetUserName(){return$this->username;}}$di=newDi();//这里使用了闭包,所以User类实际上不会被实例化,只有等到后面才会实例化$di->set('a',function(){returnnewUser('张3');});var_dump($di->get('a')->getUserName());3.使用闭包函数调用类中的方法classGrid{protected$builder;受保护的$属性;公共函数__construct(Closure$builler){$this->builder=$builler;}publicfunctionaddColumn($name,$value){$this->attribute[$name]=$value;返回$这个;}publicfunctionbuild(){//这里回调闭包函数,参数是thiscall_user_func($this->builder,$this);}公共函数__toString(){$this->构建();$str='';$call=function($val,$key)use(&$str){$str.="$key=>$val;";};array_walk($this->attribute,$call);返回$str;}}$grid=newGrid(//传入带参数的闭包函数function($grid){$grid->addColumn('key1','val1');$grid->addColumn('key2','val2');});回声$网格;
