深入理解php 匿名函数和 Closure
而在PHP 5.3发布的时候, 其中有一条new feature就是支持闭包/Lambda Function, 我第一反应是以为zval新增了一个IS_FUNCTION, 但实际上是构造了一个PHP 5.3引入的Closure”类”的实例, Closure类的构造函数是私有的, 所以不能被直接实例化, 另外Closure类是Final类, 所以也不能做为基类派生子类.
- //php-5.3.0
- $class = new ReflectionClass("Closure");
- var_dump($class->isInternal());
- var_dump($class->isAbstract() );
- var_dump($class->isFinal());
- var_dump($class->isInterface());
- //输出:
- bool(true)
- bool(false)
- bool(true)
- bool(false)
- ?>
而PHP 5.3中对闭包的支持, 也仅仅是把要保持的外部变量, 做为Closure对象的”Static属性”(并不是普通意义上的可遍历/访问的属性).
- //php-5.3.0
- $b = "laruence";
- $func = function($a) use($b) {};
- var_dump($func);
- /* 输出:
- object(Closure)#1 (2) {
- ["static"]=>
- array(1) {
- ["b"]=> string(8) "laruence"
- }
- ["parameter"]=>
- array(1) {
- ["$a"]=> string(10) "<required>"
- }
- }
- */
闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:
<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');
?>
仔细看下面的例子...看看作用域的不同
<?php
$result = 0;
$one = function()
{ var_dump($result); };
$two = function() use ($result)
{ var_dump($result); };
$three = function() use (&$result)
{ var_dump($result); };
$result++;
$one(); // outputs NULL: $result is not in scope
$two(); // outputs int(0): $result was copied
$three(); // outputs int(1)
?>
<?php
//set up variable in advance
$myInstance = null;
$broken = function() uses ($myInstance)
{
if(!empty($myInstance)) $myInstance->doSomething();
};
$working = function() uses (&$myInstance)
{
if(!empty($myInstance)) $myInstance->doSomething();
}
//$myInstance might be instantiated, might not be
if(SomeBusinessLogic::worked() == true)
{
$myInstance = new myClass();
}
$broken(); // will never do anything: $myInstance will ALWAYS be null inside this closure.
$working(); // will call doSomething if $myInstance is instantiated
?>
转载于:https://www.cnblogs.com/zhepama/p/3979961.html
深入理解php 匿名函数和 Closure相关推荐
- PHP学习笔记(一):理解匿名函数与Closure
1.PHP里的匿名函数实质是Closure类的实例 (1)不能自己实例化Closure类型的对象,会触发一个Error try{$closure = new \Closure(); }catch(Er ...
- php匿名函数use,深入理解 PHP 匿名函数关键字 use 的 Runtime Context
PHP 的匿名函数定义时可以使用 use 关键字进行全局变量的引入,支持标量的值传递/引用传递. $msg = "hello world"; $foo = function () ...
- 匿名函数的this指向为什么是window?
以下是知乎上的两个回答,分别从宏观和微观的角度分析这个原因. 1.微观角度 作者:franky 链接:https://www.zhihu.com/question/21958425/answer/19 ...
- Php中方法作用域,PHP 函数(下):匿名函数和作用域
PHP 函数(下):匿名函数和作用域 由 学院君 创建于9个月前, 最后更新于 7个月前 版本号 #2 2282 views 1 likes 1 collects 匿名函数 从 PHP 5.3 开始, ...
- php 匿名方法,PHP基于Closure类创建匿名函数的方法详解
本文实例讲述了PHP基于Closure类创建匿名函数的方法.分享给大家供大家参考,具体如下: Closure 类 用于代表匿名函数的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象. ...
- Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记
Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...
- colsure php_PHP_PHP中Closure类的使用方法及详解,Closure,匿名函数,又称为Anonym - phpStudy...
PHP中Closure类的使用方法及详解 Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函 ...
- Js中匿名函数的理解
目录 1.js中匿名函数的N种写法 最常见的用法: 2.JavaScript 匿名函数及闭包 2.1 匿名函数 2.1.1 函数的定义 2.1.2 匿名函数的创建 2.2 闭包 2.3 举例 2.4 ...
- 深入理解Java Lambda表达式,匿名函数,闭包
前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...
最新文章
- 在敏捷研发过程中,Scrum Master角色的哪些事
- intel 核显linux驱动程序,10nm来也!Intel 11代核显Linux驱动功能冻结
- 自己动手在Spring-Boot上加强国际化功能
- 【c#】24点游戏的实现(可存档且局域网互联)
- pwn学习总结(五) —— 堆溢出经典题型整理
- Linkis1.0下载地址
- boost::spirit模块实现展示不同容器类型的输出格式化的统一和简单的方法
- windows 2008 server NTP Server
- .NET团队送给.NET开发人员的云原生学习资源
- getlanguage_Java语言环境getLanguage()方法与示例
- python 获取窗口句柄_Python如何自动化哄女朋友
- Linux 下的驱动开发最简单例子
- Vue 中实现双向绑定的 4 种方法
- 怎么证明自己会python_1024程序员节,请用一句话证明你是一个程序员!
- ApexPages.StandardSetController基本用处
- XP SP3多数功能借鉴Vista 安装将无需密码
- Python数据处理Tips数据离散变量常用5种处理方法
- JS:鼠标事件:实现鼠标移动到div背景颜色变换,移开还原
- Java复习:确定给定日期是一年的第几天
- 怎样利用python写游戏辅助_怎样才能写游戏辅助?
热门文章
- 2019公需科目快速学完_【1017丨话题】励志!69岁大爷驾校学车走红,“科目二有信心一次过quot;...
- 如何准备机器学习工程师面试
- 佩斯大学计算机科学世界排名,美国佩斯大学留学推荐 计算机科学专业
- python编程高手教程_写给编程高手的Python教程(01) 数据结构
- mysql 窗口函数_MySQL数分:窗口函数
- 山师计算机学硕分数线,2020山东师范大学考研复试分数线已公布
- python 单一继承定义_Python学习之单继承与多继承
- 硬盘使用GPT方式安装windows 10方法
- Android中打包含有Activity以及资源文件的jar包在工程中调用
- function函数嵌套 matlab_matlab – 当没有使用“end”时,一个.m文件中的多个函数是嵌套的还是本地的...