小白教你玩转php的闭包
php5.3有一个非常赞的新特性,那就是支持匿名函数(闭包)。匿名函数可用于动态创建函数,并保存到一个变量中。举个栗子:
- $func = function(){
- exit('Hello world!!');
- };//这里必须要有;结尾
- $func();
等效于
- function func(){
- exit('Hello world!!');
- }
- func();
看上去没什么新奇的地方是不?(☆_☆)/~~
别急,继续看。
看这段代码:
- function operate($operator){
- if($operator == "-"){
- return function($a,$b){
- return $a-$b;
- };
- }else{
- return function($a,$b){
- return $a+$b;
- };
- }
- }
- $subtraction = operate("-");
- echo $subtraction(4,3);//1
- $addition = operate("+");
- echo $addition(1,2);//3
通过operate函数,我们可以生成不同的函数作为结果返回,并将这个结果直接作为函数调用,上面的代码分别动态创建了减法运算和加法运算函数。
如果说仅仅是这样的话,那么我并不觉得它有多少吸引力,下面我将展示一个实战中用到的技巧:
- <?php
- header("Content-Type:text/html;charset=utf-8");
- class Di{
- private $_factory;
- public function set($id,$value){
- $this->_factory[$id] = $value;
- }
- public function get($id){
- $value = $this->_factory[$id];
- return $value();
- }
- }
- class User{
- private $_username;
- function __construct($username="") {
- $this->_username = $username;
- }
- function getUserName(){
- return $this->_username;
- }
- }
- //从这里开始看
- $di = new Di();
- $di->set("zhangsan",function(){
- return new User('张三');
- });
- $di->set("lisi",function(){
- return new User("李四");
- });
- echo $di->get("zhangsan")->getUserName();
- echo $di->get("lisi")->getUserName();
代码中有一个Di容器用来保存对象实例,然后通过set()方法注册服务,通过get()方法获取服务。
我们看到$di->set()的时候,使用了匿名函数,我们预先注册了zhangsan和lisi两个服务,这两个服务都是User类的实例,在$di->set的时候实际上并没有实例化,而是在$di->get()的时候才执行了匿名函数并将对象返回,这就实现了按需实例化,不用则不实例化,提高效率。
闭包特性:
经常写js的同学应该知道js的闭包特性,简单的说就是在一个函数里可以定义子函数,父函数中的变量在子函数中可以直接使用,那么PHP的闭包怎么用呢?有一点区别。
- function func1($a){
- return function() use ($a){
- echo $a;
- };
- }
- $a = func1("a");
- $a();//输出a
当你想将外层变量传进内层匿名函数时,使用use (变量)的方式。
闭包的用途可以用于很多地方,常见于DI模式中,这篇文章的代码只是为了说明,不可以直接使用,谢谢。
http://www.thinkphp.cn/topic/13624.html
小白教你玩转php的闭包的更多相关文章
- 手把手教你玩转SOCKET模型之重叠I/O篇(下)
四. 实现重叠模型的步骤 作 了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了.其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会 如何来使用它,却 ...
- 腾讯工程师教你玩转 RocksDB
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云数据库内核团队 原文标题:[腾讯云CDB]教你玩转MyRocks/RocksDB-STATISTICS与后台线程篇 0. Intro ...
- 转:变手把手教你玩转SOCKET模型之重叠I/O篇
手把手教你玩转SOCKET模型之重叠I/O篇 “身为一个初学者,时常能体味到初学者入门的艰辛,所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人.我也希望大家能把自己的所学和他人一起分享,不要去鄙 ...
- 不止是联网!教你玩转PC自带Wi-Fi网卡
前言:Wi-Fi对于现在的智能手机来说已经是再熟悉不过的配置了,而主板自带Wi-Fi网卡的设计也越来越普及,但有些玩家可能思维还停留在“Wi-Fi网卡 = 连无线网络用的网卡,我用有线就不需要”的层次 ...
- 手把手教你玩转 CSS3 3D 技术
css3的3d起步 要玩转css3的3d,就必须了解几个词汇,便是透视(perspective).旋转(rotate)和移动(translate).透视即是以现实的视角来看屏幕上的2D事物,从而展现3 ...
- 手把手教你玩转CSS3 3D技术
手把手教你玩转 CSS3 3D 技术 要玩转css3的3d,就必须了解几个词汇,便是透视(perspective).旋转(rotate)和移动(translate).透视即是以现实的视角来看屏幕上 ...
- 支撑微博亿级社交平台,小白也能玩转Redis集群(实战篇)
上篇文章<支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)>介绍了Redis集群相关原理,这篇文章将介绍Redis Cluster集群的搭建.配置,运维.扩容等具体操作 集群搭建 ...
- 教你玩转Linux系统目录结构
Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的.Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POS ...
- 知识全聚集 .Net Core 技术突破 | 我用C#手把手教你玩微信自动化一
知识全聚集 .Net Core 技术突破 | 我用C#手把手教你玩微信自动化一 教程 01 | 模块化方案一 02 | 模块化方案二 03 | 简单说说工作单元 其他教程预览 分库分表项目实战教程 G ...
随机推荐
- hdu Pie
这道题是一道二分搜索的题,首先计算出最大的平均体积:mx=V总/f:然后去left=0,right=mx,mid=(left+right)/2进行二分搜索,当所有pi分割出的mid的个数是大于等于f时 ...
- IOS第五天(2:用户登录,回车的监听(代理模式UITextFieldDelegate)) 和关闭键盘
*********用户登录,回车的监听(代理模式UITextFieldDelegate) #import "HMViewController.h" @interface HMVie ...
- Symantec更新服务器
HTTP liveupdate.symantec.com liveupdate.symantecliveupdate.com FTP update.symantec.com/opt/content ...
- 解决Eclipse Debug 的source not found问题
最近在做Android 4.4系统的定制开发(RockIII)进行Debug时,并打上断点,运行到断点处时,Debug窗口出现source not found问题(没有自动关联程序编码): 解决办法: ...
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...
- CSS权威指南 - 浮动和定位 1
定位 定位的想法很简单元素框相对于正常位置出现在哪里. 定位:static,相对, 绝对, fixed, 继承 static就是默认的位置 相对就是相对于默认位置的偏移.原来的static定位位置依然 ...
- 【翻译】KNACK制作介绍
KNACK 次世代游戏机的性能开发新世界,PlayStation 4首发游戏的舞台幕后 配合PS4的国内首发,作为SCE的第一个游戏发售的本作. 一边加入发挥次世代机机能的表现,设计了谁都可以 ...
- DCDC(4.5V to 23V -3.3V)
这里的电感应该用体积10*12的
- LR中的编码问题
[转载]LoadRunner字符集与检查点的探讨 很多人在loadrunner测试脚本中加入中文检查点的时候会出现检查失败的情况,究竟是为什么呢?其实是被测试系统与loadrunner字符集之间的转换 ...
- 五一结束,北戴河,yy,差一点,不太敢
collectionView Cell 设置颜色,蓝色,但是其他cell颜色也蓝色了,因为只写了if 没写else if (indexPath.item == 0) { cell.background ...