而在PHP 5.3发布的时候, 其中有一条new feature就是支持闭包/Lambda Function, 我第一反应是以为zval新增了一个IS_FUNCTION, 但实际上是构造了一个PHP 5.3引入的Closure”类”的实例, Closure类的构造函数是私有的, 所以不能被直接实例化, 另外Closure类是Final类, 所以也不能做为基类派生子类.

  1. //php-5.3.0
  2. $class = new ReflectionClass("Closure");
  3. var_dump($class->isInternal());
  4. var_dump($class->isAbstract() );
  5. var_dump($class->isFinal());
  6. var_dump($class->isInterface());
  7. //输出:
  8. bool(true)
  9. bool(false)
  10. bool(true)
  11. bool(false)
  12. ?>

  而PHP 5.3中对闭包的支持, 也仅仅是把要保持的外部变量, 做为Closure对象的”Static属性”(并不是普通意义上的可遍历/访问的属性).

  1. //php-5.3.0
  2. $b = "laruence";
  3. $func = function($a) use($b) {};
  4. var_dump($func);
  5. /* 输出:
  6. object(Closure)#1 (2) {
  7. ["static"]=>
  8. array(1) {
  9. ["b"]=> string(8) "laruence"
  10. }
  11. ["parameter"]=>
  12. array(1) {
  13. ["$a"]=> string(10) "<required>"
  14. }
  15. }
  16. */

闭包函数也可以作为变量的值来使用。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相关推荐

  1. PHP学习笔记(一):理解匿名函数与Closure

    1.PHP里的匿名函数实质是Closure类的实例 (1)不能自己实例化Closure类型的对象,会触发一个Error try{$closure = new \Closure(); }catch(Er ...

  2. php匿名函数use,深入理解 PHP 匿名函数关键字 use 的 Runtime Context

    PHP 的匿名函数定义时可以使用 use 关键字进行全局变量的引入,支持标量的值传递/引用传递. $msg = "hello world"; $foo = function () ...

  3. 匿名函数的this指向为什么是window?

    以下是知乎上的两个回答,分别从宏观和微观的角度分析这个原因. 1.微观角度 作者:franky 链接:https://www.zhihu.com/question/21958425/answer/19 ...

  4. Php中方法作用域,PHP 函数(下):匿名函数和作用域

    PHP 函数(下):匿名函数和作用域 由 学院君 创建于9个月前, 最后更新于 7个月前 版本号 #2 2282 views 1 likes 1 collects 匿名函数 从 PHP 5.3 开始, ...

  5. php 匿名方法,PHP基于Closure类创建匿名函数的方法详解

    本文实例讲述了PHP基于Closure类创建匿名函数的方法.分享给大家供大家参考,具体如下: Closure 类 用于代表匿名函数的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象. ...

  6. Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记

    Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...

  7. colsure php_PHP_PHP中Closure类的使用方法及详解,Closure,匿名函数,又称为Anonym - phpStudy...

    PHP中Closure类的使用方法及详解 Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函 ...

  8. Js中匿名函数的理解

    目录 1.js中匿名函数的N种写法 最常见的用法: 2.JavaScript 匿名函数及闭包 2.1 匿名函数 2.1.1 函数的定义 2.1.2 匿名函数的创建 2.2 闭包 2.3 举例 2.4 ...

  9. 深入理解Java Lambda表达式,匿名函数,闭包

    前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...

最新文章

  1. 在敏捷研发过程中,Scrum Master角色的哪些事
  2. intel 核显linux驱动程序,10nm来也!Intel 11代核显Linux驱动功能冻结
  3. 自己动手在Spring-Boot上加强国际化功能
  4. 【c#】24点游戏的实现(可存档且局域网互联)
  5. pwn学习总结(五) —— 堆溢出经典题型整理
  6. Linkis1.0下载地址
  7. boost::spirit模块实现展示不同容器类型的输出格式化的统一和简单的方法
  8. windows 2008 server NTP Server
  9. .NET团队送给.NET开发人员的云原生学习资源
  10. getlanguage_Java语言环境getLanguage()方法与示例
  11. python 获取窗口句柄_Python如何自动化哄女朋友
  12. Linux 下的驱动开发最简单例子
  13. Vue 中实现双向绑定的 4 种方法
  14. 怎么证明自己会python_1024程序员节,请用一句话证明你是一个程序员!
  15. ApexPages.StandardSetController基本用处
  16. XP SP3多数功能借鉴Vista 安装将无需密码
  17. Python数据处理Tips数据离散变量常用5种处理方法
  18. JS:鼠标事件:实现鼠标移动到div背景颜色变换,移开还原
  19. Java复习:确定给定日期是一年的第几天
  20. 怎样利用python写游戏辅助_怎样才能写游戏辅助?

热门文章

  1. 2019公需科目快速学完_【1017丨话题】励志!69岁大爷驾校学车走红,“科目二有信心一次过quot;...
  2. 如何准备机器学习工程师面试
  3. 佩斯大学计算机科学世界排名,美国佩斯大学留学推荐 计算机科学专业
  4. python编程高手教程_写给编程高手的Python教程(01) 数据结构
  5. mysql 窗口函数_MySQL数分:窗口函数
  6. 山师计算机学硕分数线,2020山东师范大学考研复试分数线已公布
  7. python 单一继承定义_Python学习之单继承与多继承
  8. 硬盘使用GPT方式安装windows 10方法
  9. Android中打包含有Activity以及资源文件的jar包在工程中调用
  10. function函数嵌套 matlab_matlab – 当没有使用“end”时,一个.m文件中的多个函数是嵌套的还是本地的...