php循环奇,PHP 奇技淫巧

本文介绍了PHP中闭包的使用,包括如何定义并立即调用匿名函数,如何在闭包中访问外部上下文变量,以及如何结合`use`关键字与`$this`。通过示例展示了在控制器中使用闭包调用具体方法的技巧,并提到了闭包在实现装饰器函数中的应用。文章适合有一定PHP基础的开发者阅读,探讨了PHP5.3到5.4版本中闭包功能的增强。
摘要由CSDN通过智能技术生成

原标题:PHP 奇技淫巧

自从PHP玩闭包后,大家一口气跳五楼,不费劲。

1、基础:一句话实现定义一个函数并立即调用

大家在Java里经常这么搞,因为变量污染是个不可容忍的事儿。但是PHP里如何实现这样的功能?一个可行方法是:

call_user_func(function(){ echo "hello,world"; });

2、上下文变量

在1的基础上,来个有意思的:用一个匿名函数当做匿名空间,同时调用外部上下文变量:

$context="hello,world";call_user_func(function()use($context){echo $context;});

等下,有没有觉得这context的叫法有点像Django的感觉?嗯,完全可以利用这个方法可以包装出一个通用的视图方法,但是use不能和$this直接联用,怎么办?既然这个($this)不让用,就用那个($that)。参见第三条。

3、 use和$this

在2的基础之上,更强大的用法(use当前类对象的引用)。

class Contrller { //...其他方法 public function view($template_name,$context=NULL,$isShow=true){ ob_start(); $that=$this; //注意$this不能直接用于use call_user_func( //这里可以向视图文件传入参数 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; } } }

事实上,这个例子用的做作了,PHP5.3之后适用。自PHP5.4之后,可以无需使用use即可使用$this。

官方文档的参考链接

Changelog

Version Deion

5.4.0$this can be used in anonymous functions.

5.3.0 Anonymous functions become available.

这真是件大快人心的大好事!测试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();

所以,对于高版本的PHP,就不用搞个$that了。

刚刚去搜了下相关问题,stackoverflow上这组问答非常值得参考,今天才发现,罪过罪过:

又去翻了下文档,有了这个特性之后,类似Java里apply之类的this劫持也可以实现了,这真是大快人心的事情。

4、碉堡了的特性:调用那个可调用的东西

调用一切可调用的东西,不只是你自定义的函数。

简单例子:把这个用于实现一个通用控制器。

class Contrller{ //调用具体的action, public function __act($action){ call_user_func( array($this,$action) ); } } class HelloContrller extends Controller{ public function index(){ } public function hello(){ } public function dance(){ } }

这个例子也是有点做作,看一眼就好,因为$this->{$action}()的用法更简洁,也更符合直观的思维习惯。虽然这里题目要求是奇技淫巧,还是正常、直观、简洁些好。

再写一个路由(亲测不超过40行即可实现)基本上一个MVC框架的雏形就出来了。

5、利用闭包实现和Python类似的装饰器函数

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值