博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解php 匿名函数和 Closure
阅读量:5819 次
发布时间:2019-06-18

本文共 1792 字,大约阅读时间需要 5 分钟。

而在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 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:

<?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
?>

转载地址:http://jkwdx.baihongyu.com/

你可能感兴趣的文章
Windows 8下如何删除无线配置文件
查看>>
解决Windows 7中文件关联和打开方式
查看>>
oracle系列(五)高级DBA必知的Oracle的备份与恢复(全录收集)
查看>>
Hyper-V 2016 系列教程24 配置 iSCSI存储服务器
查看>>
hp 服务器通过串口重定向功能的使用
查看>>
国外10大IT网站和博客网站
查看>>
C#窗体控件更新(六)
查看>>
对java语言学习的个人看法
查看>>
android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果
查看>>
zabbix 批量web url监控
查看>>
大容量导入和导出数据 -- 格式化文件生成
查看>>
MongoDB CookBook读书笔记之导入导出
查看>>
mysql高可用方案之Keepalived+主主复制
查看>>
Nginx+PHP7 安装及配置
查看>>
KeyPass密码管理软件使用说明
查看>>
shell如何快速锁定所有账号
查看>>
听比喻,懂原理(1)超五类双绞线和六类双绞线的区别
查看>>
HTML 5实现的手机摇一摇
查看>>
NLB单播和多播区别
查看>>
轻松应对IDC机房带宽突然暴涨问题
查看>>