php匿名函数的作用中的use有什么用

本文试用于基础者,高手请关闭本页面本文阅读2分钟,理解难者就不好说了,鼓励亲自试验一下匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。  匿名函数目前是通过 Closure 类来实现的。Example #1 匿名函数示例&?phpecho preg_replace_callback('~-([a-z])~', function ($match) {
return strtoupper($match[1]);}, 'hello-world');// 输出 helloWorld?&闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:Example #2 匿名函数变量赋值示例&?php$greet = function($name){
printf("Hello %s\r\n", $name);};$greet('World');$greet('PHP');?&闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。 PHP 7.1 起,不能传入此类变量: superglobals、 $this 或者和参数重名。Example #3 从父作用域继承变量&?php$message = 'hello';// 没有 "use"$example = function () {
var_dump($message);};echo $example();// 继承 $message$example = function () use ($message) {
var_dump($message);};echo $example();// Inherited variable's value is from when the function// is defined, not when called$message = 'world';echo $example();// Reset message$message = 'hello';// Inherit by-reference$example = function () use (&$message) {
var_dump($message);};echo $example();// The changed value in the parent scope// is reflected inside the function call$message = 'world';echo $example();// Closures can also accept regular arguments$example = function ($arg) use ($message) {
var_dump($arg . ' ' . $message);};$example("hello");?&以上例程的输出类似于:Notice: Undefined variable: message in /example.php on line 6
string(5) "hello"
string(5) "hello"
string(5) "hello"
string(5) "world"
string(11) "hello world"
这些变量都必须在函数或类的头部声明。 从父作用域中继承变量与使用全局变量是不同的。全局变量存在于一个全局的范围,无论当前在执行的是哪个函数。而 闭包的父作用域是定义该闭包的函数(不一定是调用它的函数)。示例如下:Example #4 Closures 和作用域&?php// 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。// 其中有一个方法用来计算购物车中所有商品的总价格,该方法使// 用了一个 closure 作为回调函数。class Cart{
const PRICE_BUTTER
const PRICE_MILK
const PRICE_EGGS
$products = array();
public function add($product, $quantity)
$this-&products[$product] = $quantity;
public function getQuantity($product)
return isset($this-&products[$product]) ? $this-&products[$product] :
public function getTotal($tax)
$total = 0.00;
$callback =
function ($quantity, $product) use ($tax, &$total)
$pricePerItem = constant(__CLASS__ . "::PRICE_" .
strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
array_walk($this-&products, $callback);
return round($total, 2);;
}}$my_cart = new Cart;// 往购物车里添加条目$my_cart-&add('butter', 1);$my_cart-&add('milk', 3);$my_cart-&add('eggs', 6);// 打出出总价格,其中有 5% 的销售税.print $my_cart-&getTotal(0.05) . "\n";// 最后结果是 54.29?&Example #5 Automatic binding of $this&?phpclass Test{
public function testing()
return function() {
var_dump($this);
}}$object = new Test;$function = $object-&testing();$function();
?&以上例程会输出:object(Test)#1 (0) {
以上例程在PHP 5.3中的输出:Notice: Undefined variable: this in script.php on line 8
NULLAs of PHP 5.4.0, when declared in the context of a class, the current class is automatically bound to it, making $this available inside of the function's scope. If this automatic binding of the current class is not wanted, then
may be used instead.Static anonymous functionsAs of PHP 5.4, anonymous functions may be declared statically. This prevents them from having the current class automatically bound to them. Objects may also not be bound to them at runtime.Example #6 Attempting to use $this inside a static anonymous function&?phpclass Foo{
function __construct()
$func = static function() {
var_dump($this);
}};new Foo();?&以上例程会输出:Notice: Undefined variable: this in %s on line %d
Example #7 Attempting to bind an object to a static anonymous function&?php$func = static function() {
// function body};$func = $func-&bindTo(new StdClass);$func();?&以上例程会输出:Warning: Cannot bind an instance to a static closure in %s on line %d
关于php匿名函数中的use
http://blog.csdn.net/qmhball/article/details/
匿名函数中的use,其作用就是从父作用域继承变量。
下例是最常见的用法,如果不...
php中的匿名函数简单使用
直接上代码了:不懂你们有没有一种感觉,看见了js?近视的我,看到了function 就以为js…好了,你看看最开始,是不是一个test1变量右边一个赋值符号,然后赋值符号(=号)的右边是一个函数?这个...
php 匿名函数
这里主要简单介绍下匿名函数,闭包及use关键字的用法
PHP之匿名函数
Closure类,用于代表匿名函数的类。
http://blog.csdn.net/wuxing26jiayou/article/details/Closure::__constru...
PHP 匿名函数和回调函数的使用
PHP 匿名函数和回调函数的使用开发环境
phpstorm 2016.1
Mac OS 10.12.1
PHP匿名函数及闭包
[iefreer] 转载一篇对PHP闭包语法讲解比较深入到位的文章,后续还会转一篇这些新语法如何巧妙应用的文章。匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这...
php匿名函数
//匿名函数实际上相当于把函数当做变量,不需要专门去定义一个函数。
// 在匿名函数出现之前,如果想把函数当做变量传递,得用字符串的形式
$funcname=function ($param) {ec...
PHP匿名函数作为参数
function sayHi($words,$func){
call_user_func($func,26);
sayHi('hello world,',funct...
PHP 匿名函数和匿名类
匿名函数1)
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值2) 闭包可以...
PHP匿名函数
1、匿名函数就是临时创建的没有名称的函数。
2、PHP从PHP5.3.0版本开始支持匿名函数。
3、PHP的匿名函数通过closures实现,常用于回调函数。
下面看一例子:
没有更多推荐了,现代 PHP 新特性系列(五) —— 闭包和匿名函数
闭包和匿名函数在PHP 5.3.0中引入,这两个特性非常有用,每个PHP开发者都应该掌握。
闭包是指在创建时封装周围状态的函数,即使闭包所在的环境的不存在了,闭包中封装的状态依然存在。
匿名函数其实就是没有名称的函数,匿名函数可以赋值给变量,还能像其他任何PHP函数对象那样传递。不过匿名函数仍然是函数,因此可以调用,还可以传入参数,适合作为函数或方法的回调。
注:理论上讲闭包和匿名函数是不同的概念,不过PHP将其视作相同的概念(匿名函数在PHP中也叫作闭包函数),所以下面提到闭包时指的也是匿名函数;反之亦然。
2、创建闭包
创建闭包很简单:
$greet = function ($name) {
return sprintf("Hello %s\r\n", $name);
echo $greet('LaravelAcademy.org');
结果打印:
Hello LaravelAcademy.org
闭包和普通的PHP函数很像:常用的句法相同,也接受参数,而且能返回值。不过闭包没有函数名。
注:我们之所以能调用$greet变量,是因为这个变量的值是一个闭包,而且闭包对象实现了__invoke()魔术方法,只要变量名后有(),PHP就会查找并调用__invoke方法。
我们通常把PHP闭包当做函数会方法的回调使用,事实上,很多PHP函数都会用到闭包,比如array_map和preg_replace_callback,这是使用PHP匿名函数的绝佳时机。记住,闭包和其他值一样,可以作为参数传入其他PHP函数:
$numberPlusOne = array_map(function ($number) {
return $number += 1;
}, [1, 2, 3]);
print_r($numberPlusOne);
在闭包出现之前,要实现这样的功能,PHP开发者只能单独创建具名函数,然后使用名称引用这个函数:
function incrementNumber ($number) {
return $number += 1;
$numberPlusOne = array_map(‘incrementNumber’,
[1, 2, 3]);
print_r($numberPlusOne);
这样做把回调的实现和使用场所隔离开了,而且使用闭包实现代码更加简洁。
3、从父作用域继承变量
在PHP中必须手动调用闭包对象的bindTo方法或使用use关键字把父作用域的变量及状态附加到PHP闭包中。而实际应用中,又以使用use关键字实现居多。
实际上,Laravel框架中也大量使用了闭包,最常见的比如路由定义:
Route::group(['domain' =& '{account}.myapp.com'], function () {
Route::get('user/{id}', function ($account, $id) {
这里面的两个function都是闭包。而从父作用域继承变量的使用场景在Laravel底层源码中也是俯拾即是,比如Model.php(Illuminate\Database\Eloquent)的saveOrFail方法:
该方法的作用是使用事务将模型数据保存到数据库,这里面我们使用闭包返回保存状态,同时使用use关键字将父作用域的$options传递给该闭包以便其能够访问这个数据。
此外,还支持传递多个父作用域变量到闭包,比如还是在Model类中的forceFill方法:
多个变量以逗号分隔即可。
bindTo方法
我们在前面已经提到,闭包是一个对象,所以我们可以在闭包中使用$this关键字获取闭包的内部状态,闭包对象的默认状态没什么用,需要注意的是其中的__invoke魔术方法和bindTo方法。
__invoke的作用前面已经说过,当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
接下来我们来看看bindTo方法,通过该方法,我们可以把闭包的内部状态绑定到其他对象上。这里bindTo方法的第二个参数显得尤为重要,其作用是指定绑定闭包的那个对象所属的PHP类,这样,闭包就可以在其他地方访问邦定闭包的对象中受保护和私有的成员变量。
你会发现,PHP框架经常使用bindTo方法把路由URL映射到匿名回调函数上,框架会把匿名回调函数绑定到应用对象上,这样在匿名函数中就可以使用$this关键字引用重要的应用对象:
class App {
protected $routes = [];
protected $responseStatus = '200 OK';
protected $responseContentType = 'text/html';
protected $responseBody = 'Laravel学院';
public function addRoute($routePath, $routeCallback) {
$this-&routes[$routePath] = $routeCallback-&bindTo($this, __CLASS__);
public function dispatch($currentPath) {
foreach ($this-&routes as $routePath =& $callback) {
if( $routePath === $currentPath) {
$callback();
header('HTTP/1.1 ' . $this-&responseStatus);
header('Content-Type: ' . $this-&responseContentType);
header('Content-Length: ' . mb_strlen($this-&responseBody));
echo $this-&responseB
这里我们需要重点关注addRoute方法,这个方法的参数分别是一个路由路径和一个路由回调,dispatch方法的参数是当前HTTP请求的路径,它会调用匹配的路由回调。第9行是重点所在,我们将路由回调绑定到了当前的App实例上。这么做能够在回调函数中处理App实例的状态:
$app = new App();
$app-&addRoute(‘user/nonfu’, function(){
$this-&responseContentType = ‘application/charset=utf8’;
$this-&responseBody = ‘{“name”:”LaravelAcademy"}';
$app-&dispatch(‘user/nonfu');
在Larval底层也有用到bindTo方法,详见Illuminate\Support\Traits\Macroable的__call方法:
声明: 原创文章,未经允许,禁止转载!
这篇文章对我很有帮助
这篇文章对我很有帮助
学院君 has written
Laravel学院院长,终身学习者
积分:100327
职业:码农
城市:杭州
支持 Markdown 语法,提交之前可通过预览查看效果PHP匿名函数 - 简书
PHP匿名函数
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数()参数的值。
闭包函数可以作为变量的值使用,最后需要加分号。
$test = function ($var) {
$test('hello');
$test('world');
回调函数参数
function myfunction($v)
return($v*$v);
$a=array(1,2,3,4,5);
print_r(array_map("myfunction",$a));//1,4,9,16,25
$test = ['a' =& 1, 'b' =& 2];
$res = array_map(function ($item) {
$item = 3;
return $//注意,一定要有return
}, $test);
echo $//['a'=&3,'b'=&3]
父作用域继承变量
闭包想要使用父作用域中的变量需要使用use关键字,匿名函数不会自动从父作用域中继承变量。
$var = "hello";
$test = ['apple', 'orange'];
$res = array_map(function ($item) use ($var) {
$item = $var . ',' . $
}, $test);
print_r($test);//["hello,apple","hello,orange"]
use中还可以使用引用变量
$test = [1, 2, 3];
$res = array_map(function ($item) use (&$var) {
}, $test);
写一个方法,去重构整个世界!
匿名函数可用于动态创建函数,并保存到一个变量中。举个栗子: 等效于: 看上去没什么新奇的地方,别急,继续看。 通过operate函数,我们可以生成不同的函数作为结果返回,并将这个结果直接作为函数调用,上面的代码分别动态创建了减法运算和加法运算函数。 展示一个实战中用到的技巧...
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。 简单匿名函数 变量赋值 继承变量 函数或类的头部声明 继承变量的值是从函数...
熟练运用函数是JavaScript程序员的必备技能,因为在JavaScript中函数实在是太常用了。它能够完成的任务种类非常之多,而在其他语言中则需要很多特殊的语法支持才能达到这种能力。 在本章将会介绍在JavaScript中定义函数的多种方式,包括函数表达式和函数声明、以...
题目 时间限制:10000ms单点时限:1000ms内存限制:256MB描述给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大。其中AND是按位与操作。 小Ho当然知道怎么做。...
查看以下代码。 false == 0返回:true这是一个类型转换示例,之前你已经见过。JavaScript 认为 0 表示 false,因此比较结果为true。那么为何要再次提到该示例呢? 如果再深入思考下,就会更容易回答为何 JavaScript 将值 0 转型为 fa...
一树树的繁花 温柔 羞涩轻倚在石墙边 一朵朵的笑脸 俏丽 灿烂绽放在日光下 是来赴那场初夏的盛会么? 还是相约 在这一年中最美好的季节 悄悄告诉我 今生 关于你的心情故事…… 轻轻走过你的身旁 无需言语 你那一颦一笑 你那羞涩弄裳 你那俯首蹙眉 你那低吟浅唱 都足矣让我懂你...
文、摄影/菡萏莲荷 四月,又见丁香花。 今天拾得一小串丁香花花蕾,不是贪恋花的美色,而是想闻一闻丁香花蕾的味道。 我用手轻轻碾碎花苞,一股清新的类似草的淡香扑鼻而来,没有一点儿花的香气。 花香袭人,花开有韵…… 听,花开的声音……
妈妈说,我终于找到快乐了。 哥哥说,没事儿,笑一笑没什么大不了。 我说,你们为什么都要离开我。 微笑抑郁症,杀人与无形,不知道你从什么时候潜伏在我的身边悄无声息的夺走了我最爱的两个人,而我却不知道该如何像你复仇。 妈妈笑着说没事儿,哥哥笑着说,没关系。他们的声音还在耳边会想...php中的匿名函数什么时候使用?
[问题点数:40分,结帖人qq_]
本版专家分:0
结帖率 85.71%
CSDN今日推荐
本版专家分:20394
2016年5月 PHP大版内专家分月排行榜第二2015年5月 PHP大版内专家分月排行榜第二
2017年7月 PHP大版内专家分月排行榜第三2017年6月 PHP大版内专家分月排行榜第三2017年5月 PHP大版内专家分月排行榜第三2016年10月 PHP大版内专家分月排行榜第三2016年9月 PHP大版内专家分月排行榜第三2015年10月 PHP大版内专家分月排行榜第三2014年12月 PHP大版内专家分月排行榜第三2014年9月 PHP大版内专家分月排行榜第三
本版专家分:0
本版专家分:65083
2016年10月优秀小版主
2017年1月 总版技术专家分月排行榜第三
2017年2月 PHP大版内专家分月排行榜第一2017年1月 PHP大版内专家分月排行榜第一
2017年7月 PHP大版内专家分月排行榜第二2017年6月 PHP大版内专家分月排行榜第二2017年5月 PHP大版内专家分月排行榜第二2017年4月 PHP大版内专家分月排行榜第二2017年3月 PHP大版内专家分月排行榜第二2016年12月 PHP大版内专家分月排行榜第二2016年11月 PHP大版内专家分月排行榜第二2016年10月 PHP大版内专家分月排行榜第二2016年9月 PHP大版内专家分月排行榜第二2016年7月 PHP大版内专家分月排行榜第二2016年6月 PHP大版内专家分月排行榜第二2016年3月 PHP大版内专家分月排行榜第二2016年2月 PHP大版内专家分月排行榜第二2016年1月 PHP大版内专家分月排行榜第二2015年11月 PHP大版内专家分月排行榜第二2015年10月 PHP大版内专家分月排行榜第二2015年8月 PHP大版内专家分月排行榜第二2015年7月 PHP大版内专家分月排行榜第二2015年6月 PHP大版内专家分月排行榜第二2015年4月 PHP大版内专家分月排行榜第二2015年3月 PHP大版内专家分月排行榜第二2015年2月 PHP大版内专家分月排行榜第二2015年1月 PHP大版内专家分月排行榜第二2014年12月 PHP大版内专家分月排行榜第二2014年11月 PHP大版内专家分月排行榜第二2014年10月 PHP大版内专家分月排行榜第二2014年9月 PHP大版内专家分月排行榜第二2014年8月 PHP大版内专家分月排行榜第二2014年7月 PHP大版内专家分月排行榜第二2014年6月 PHP大版内专家分月排行榜第二
本版专家分:446
本版专家分:0
本版专家分:65083
2016年10月优秀小版主
2017年1月 总版技术专家分月排行榜第三
2017年2月 PHP大版内专家分月排行榜第一2017年1月 PHP大版内专家分月排行榜第一
2017年7月 PHP大版内专家分月排行榜第二2017年6月 PHP大版内专家分月排行榜第二2017年5月 PHP大版内专家分月排行榜第二2017年4月 PHP大版内专家分月排行榜第二2017年3月 PHP大版内专家分月排行榜第二2016年12月 PHP大版内专家分月排行榜第二2016年11月 PHP大版内专家分月排行榜第二2016年10月 PHP大版内专家分月排行榜第二2016年9月 PHP大版内专家分月排行榜第二2016年7月 PHP大版内专家分月排行榜第二2016年6月 PHP大版内专家分月排行榜第二2016年3月 PHP大版内专家分月排行榜第二2016年2月 PHP大版内专家分月排行榜第二2016年1月 PHP大版内专家分月排行榜第二2015年11月 PHP大版内专家分月排行榜第二2015年10月 PHP大版内专家分月排行榜第二2015年8月 PHP大版内专家分月排行榜第二2015年7月 PHP大版内专家分月排行榜第二2015年6月 PHP大版内专家分月排行榜第二2015年4月 PHP大版内专家分月排行榜第二2015年3月 PHP大版内专家分月排行榜第二2015年2月 PHP大版内专家分月排行榜第二2015年1月 PHP大版内专家分月排行榜第二2014年12月 PHP大版内专家分月排行榜第二2014年11月 PHP大版内专家分月排行榜第二2014年10月 PHP大版内专家分月排行榜第二2014年9月 PHP大版内专家分月排行榜第二2014年8月 PHP大版内专家分月排行榜第二2014年7月 PHP大版内专家分月排行榜第二2014年6月 PHP大版内专家分月排行榜第二
匿名用户不能发表回复!
其他相关推荐
本文试用于基础学习者,高手请关闭本页面本文阅读2分钟,理解难者就不好说了,鼓励亲自试验一下匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。  匿名函数目前是通过 Closure 类来实现的。Example #1 匿名函数示例&?phpecho ...
PHP 匿名函数和回调函数的使用开发环境
phpstorm 2016.1
Mac OS 10.12.1
header('content-type:text/charset=utf-8');//声明函数swap,作为下面匿名函数的回调函数
function swap(&$x, &$y)
$temp = $x;
laravel中匿名函数使用居多,
不搞清楚匿名函数参数及调用的问题,laravel没法搞,废话不多说,上代码:
class Foo {
public function f() {
echo 'Foo....f';
class Too {
public function t($name, Closure $c) {
* 动态函数执行与匿名函数执行\\
技术QQ交流群:
//动态函数执行
function a(){
'a';
function b(){
echo 'b';
function c($c){
echo 'c';
//C($_GET['c']);
闭包和匿名函数在PHP 5.3.0中引入,这两个特性非常有用,每个PHP开发者都应该掌握。
闭包是指在创建时封装周围状态的函数,即使闭包所在的环境的不存在了,闭包中封装的状态依然存在。
匿名函数其实就是没有名称的函数,匿名函数可以赋值给变量,还能像其他任何PHP函数对象那样传递。不过匿名函数仍然是函数,因此可以调用,还可以传入参数,适合作为函数或方法的回调。
现在的php是即支持面向对象的语言由支持面向过程的语言,在开发过程中我们往往会混合使用,回调会让我们容易将两种编码方式做整合,做到优秀的插拔。而闭包操作和回调都是建立在匿名函数基础之上的。
/* 简单的用于实验的类
class Product{
function __construct
匿名函数,也叫闭包函数(closures) ,允许临时创建一个没有制定名称的函数。最常用作回调函数(callback)参数的值。匿名函数实例:&?php
* preg_replace_callback 执行一个正则表达式所搜并且使用一个回调进行替换。
* strtoupper 将字符串转化为大写
echo preg_replace_callbac
如题,至于为什么自己谷歌!
#include&iostream&
int main(){
// 匿名函数 - -&返回值类型 - lambda表达式
auto fun = [](int a)-&int{ // 定义匿名函数 并引用
cout && a &&
javascript自执行匿名函数
http://blog.csdn.net/jbgtwang/article/details/6608265
其中说到了 self-executing anonymous functions,有几种方式,最常见也比较容易理解的是:
(function(){
})();格式:function sayHi($words,$func){
call_user_func($func,26);
sayHi('hello world,',function($age){
echo "im murphy!{$age} years old";
//运行结果hello world,im murphy!26 years old
php能把函数名作为参数传递吗?
php能把函数名作为参数传递吗?
请问php能把函数名作为参数传递吗?
类似javascript,lua里面一样,函数名本来就是...
php中的匿名函数简单使用
直接上代码了:不懂你们有没有一种感觉,看见了js?近视的我,看到了function 就以为js…好了,你看看最开始,是不是一个test1变量右边一个赋值符号,然后赋值符号(=号)的右边是一个函数?这个...
PHP 匿名函数和回调函数的使用
PHP 匿名函数和回调函数的使用开发环境
phpstorm 2016.1
Mac OS 10.12.1
PHP 匿名函数 引用变量 调用自身的问题
匿名函数(Anonymous functions),也叫闭包函数(closures)。闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。如果要调用自身的话则需要传递自身的...
php匿名函数
与 可变参数函数
php函数:函数作为参数
说明:函数作为参数传入的时候,在使用形式上是以字符串形式出现的
function foo($function) {
$function(& World&);
function bar($pa...
函数作为参数 及其序列化
function count()
return $this-&mapPartitions(
function ($iterator){
PHP参数传递的方式
PHP提供了如下列所示几种网页之间传递数据的方法:
关于php匿名函数中的use
匿名函数中的use,其作用就是从父作用域继承变量。
下例是最常见的用法,如果不使用use,函数中将找不到变量$msg。运行输出
php中函数参数传递
php中函数参数传递有形参传递(借用c语言等编程语言的说法)。
即就是把变量的值赋值给函数的参数,对函数参数所做的一切操作都与原始变量无关。...
没有更多推荐了,

我要回帖

更多关于 php匿名函数 的文章

 

随机推荐