PHP匿名函数、闭包、function use
匿名函数,也叫闭包函数(closures) ,允许临时创建一个没有制定名称的函数。最常用作回调函数(callback)参数的值。
闭包函数也可以作为变量的值来使用。PHP将会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 Closure 对象赋值给一个变量的方式与普通变量赋值的语法一样,最后也要加上分号。
匿名函数变量赋值实例:
<?php
$printString = function($arg){
echo $arg;
};
$printString('hello world');
//输出 hello world
闭包函数继承父作用域中的变量。任何此类变量都应该用 use 语言结构传递进去。
从父作用域继承变量:
<?php
//定义变量
$message = 'hello world';
//匿名函数变量赋值
$example = function(){
var_dump($message);
};
//执行后输出 Notice: Undefined variable
$example();
在未使用关键字use 时,PHP不能在匿名函数中调用所在代码上下文变量。
<?php
//定义变量
$message = 'hello';
//匿名函数继承父作用域的变量($message)
$example = function() use ($message){
var_dump($message);
};
//输出 string 'hello' (length=5)
echo $example();
//同样输出 string 'hello' (length=5)
$message = 'world';
echo $example();
使用关键字use时,PHP可以在调用匿名函数中调用所在代码上下文的变量,但为什么第二次调用没有发生变化哪?
是因为匿名函数可以保存所在代码块上下文的一些变量和值(即:闭包函数将会保存第一次继承的父作用域的变量和值),值传递只是传递继承父作用域中变量和值的一个副本。
要想改变父作用域的值并体现在匿名函数调用中,该怎么办哪?
我们要用引用传递(即:在变量前面添加&),如下所示:
<?php
//定义变量
$message = 'hello';
//匿名函数继承父作用域的变量($message)
$example = function() use (&$message){
var_dump($message);
};
//输出 string 'hello' (length=5)
echo $example();
//输出 string 'world' (length=5)
$message = 'world';
echo $example();
同样闭包函数也可以接受常规参数的传递,如下所示:
<?php
//定义变量
$message = 'hello';
$message2 = 'hello2';
//匿名函数继承父作用域的变量($message)
$example = function($arg) use (&$message2, $message){
var_dump($message2 . ' ' . $message . ' ' . $arg);
};
echo $example('world');
$message2 = 'world';
//输出 string 'hello world' (length=11)
echo $example('world');
PHP匿名函数、闭包、function use的更多相关文章
- 闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别
闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别 函数最常见的形式是具名函数(named function): function foo(){ con ...
- 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数
[源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...
- php : 匿名函数(闭包) [二]
摘自: http://www.cnblogs.com/yjf512/archive/2012/10/29/2744702.html php的闭包(Closure)也就是匿名函数.是PHP5.3引入的. ...
- php : 匿名函数(闭包) [一]
摘自: http://www.cnblogs.com/starlion/p/3894578.html 一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous fu ...
- javascript匿名函数 闭包
匿名函数 (function(){ console.info("111111111"); })(); var my = (fun ...
- PHP匿名函数(闭包)
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值.当然,也有其它应用的情况. ...
- php里面用魔术方法和匿名函数闭包函数动态的给类里面添加方法
1.认识 __set (在给不可访问属性赋值时,__set() 会被调用) 也就是说你再访问一个类里面没有的属性,会出发这个方法 class A{ private $aa = '11'; publ ...
- 自执行匿名函数: (function() { /* code */ })();
1,常见格式:(function() { /* code */ })(); 2,解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括 ...
- PHP函数(六)-匿名函数(闭包函数)
匿名函数能够临时创建一个没有名称的函数,常用作回调函数参数的值 <?php $test = function($a){ echo "Hello,".$a; }; $test( ...
- Go语言 - 函数 | 作用域 | 匿名函数 | 闭包 | 内置函数
函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 介绍 Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于“一等公民”. 函数可以赋值给变量 函数 ...
随机推荐
- unittest---unittest封装方法
前面我们写了一个关于查询歌曲的接口测试,但是代码重复性比较大,进行一次简单的优化 封装方法 在编写自动化脚本的时候,都要求代码简介,上一篇unittest---unittest断言中代码重复性比较多, ...
- dubbo 获取不到本地地址,返回 127.0.0.1
2019-08-14 12:29:09.609 WARN 1079 --- [ main] org.apache.dubbo.config.AbstractConfig : ...
- C# ThreadPool 线程池
Thread与ThreadPool Thread: .NetFramework1.0 对线程对象的一个封装 Thread方法很多很强大,但是太过强大,而且没有限制 功能繁多,反而用不好--就像给4岁 ...
- Ajax简单应用之个人简历页面搭建
1.搭建HTTP静态Web服务器. 代码实现: # 1.导入socket模块 import socket import threading # 创建服务器类 class HttpServerSocke ...
- TortoiseGit 保存账号密码
TortoiseGit下载网址:http://download.tortoisegit.org/tgit/ 修改.gitconfig .gitconfig 用于记录git配置信息 路径:系统盘:\Us ...
- Change Style of Navigation Items 更改导航项的样式
In this lesson, you will learn how to change the style of navigation items in a WinForms XAF applica ...
- Node.js C++ 插件学习指南
Node.js插件(addons) Node.js 插件是用 C++ 编写的动态链接共享对象,可以使用 require() 函数加载到 Node.js 中,且像普通的 Node.js 模块一样被使用. ...
- Keystone安装与配置
一.实验目的: 1.掌握OpenStack环境搭建的基础工作 2.掌握keystone的安装与配置方法 3.掌握keystone基础接口的调用方法 二.实验步骤: 1.利用最初创建的快照克隆两台Cen ...
- mybatis入门视频总结
1.基础知识 2. 原生态jdbc问题总结 3.mybatis是什么 4.工程结构 5.SqlMapConfig.xml文件 6.sqlmap 包下新建user.xml文件(namespace,par ...
- THUWC2019酱油记
Day -1 坐了一上午动车来到帝都,晚上去了趟THU还有奥林匹克公园. 反正也是来打酱油的,颓废怎么能少呢.