当前位置:首页 » 编程语言 » php闭包usethis

php闭包usethis

发布时间: 2022-07-25 23:37:28

php如何序列化/存储闭包(Closure)

实在需要序列化,可以用反射(Reflection),并直接操作代码文件获得上下文信息:/*** 创建一个反射:*/$reflection = new ReflectionFunction($closure);/*** 参数可以直接得到了:*/$params = $reflection-getParameters();/*** 获得Closure的函数体和use变量,形如: * function($arg1, $arg2, ...) use ($val1, $val2, ...) { * // 要获得这个部分的代码!* }* 办法很多,你可以直接用正则、字符串查找或者Tokenizer,等等等等。 * 比如可以先从reflection里得到函数的开始行和结束行:*/$startLine = $reflection-getStartLine(); $endLine = $reflection-getEndLine(); // 然后用str*这个,str*那个的函数来清理,细节不写了:

㈡ js闭包和PHP闭包的区别

1 什么是闭包
php:你跟我聊闭包之前啊,首先来聊聊 匿名函数(Anonymous function)下面就是一个匿名函数的栗子,匿名函数 顾名思义就是没有名字啊。。
(PHP在引入闭包之前,也有一个可以创建匿名函数的函数:create function,但是代码逻辑只能写成字符串,这样看起来很晦涩并且不好维护,所以很少有人用。)本人没有验证~~
$func = function(){
}; //带结束符(一定要带)
实现闭包
将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。
(闭包可以保存所在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。所以下面的一段函数会报错 undefined variable a )
function add($a)
{ $a = $a; $fun1 = function ($b=2)
{ echo $a+$b; };
return $fun1; }
$fun1 = add(21);
$fun1(6);
如果想使用 $a 怎么办。php 是见招拆招啊。 关键字 use:
function add($a)
{ $a = $a; $fun1 = function ($b=2) use ($a) //只需要一个use($a)
{ echo $a+$b; };
return $fun1; }
$fun1 = add(21);
$fun1(6); //27
那么能否在匿名函数中改变上下文的 变量呢 来做个试验吧
function add($a) { // $a = $a; $fun1 = function ($b=2) use ($a) { echo $a; $a++; }; $fun1(); echo $a; }
$fun1 = add(21);
//2121 哦 很遗憾 传值是不行的
那来试试 传引用吧
function add($a) { // $a = $a; $fun1 = function ($b=2) use (&$a) { echo $a; $a++; }; $fun1(); echo $a; }
$fun1(6); //2122 哦 可以的
使用use 关键字匿名函数就可以引用上下文的变量了。如果将匿名函数返回给外界,匿名函数会保存use所引用的变量,而外界则不能得到这些变量,这样形成‘闭包’这个概念可能会更清晰一些。(也就是说 use 所引用的变量 会一直保存在内存中,直到显示销毁 这是闭包的一大特点)
javascript:你们php弱爆了。我们js可以直接调用 函数外部的变量。来唠唠js的闭包吧。
先来聊聊 js的变量作用域吧。1 全局变量,2局部变量(var vname)
阮一峰前辈说:js的闭包可以简单的理解为,能够获取函数外部的变量的函数,就叫闭包。
一是读取函数内部的变量,
二是让这些变量的值保存在内存中,实现数据共享
闭包就是能够读取其他函数内部变量的函数。
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
注意:::在javascript里,在函数里声明的函数都是局部的,函数运行完后就释放了
ECMAScript 描述:
函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。

㈢ PHP闭包函数传参及使用外部变量的方法

本文实例讲述了PHP闭包函数传参及使用外部变量的方法。分享给大家供大家参考,具体如下:
在Laravel控制器写两个方法,一个是在内部创建一个闭包函数,一个是执行传过来的闭包函数,测试闭包的写法,use使用外部变量,及闭包函数的传参。如下:
//测试闭包传参及use使用外部变量
public
function
testClosure($t1,
$t2)
{
$closure
=
function
($param1,
$param2)
use
($t1,
$t2)
{
echo
$param1.$param2.$t1.$t2;
};
$this->execClosure('test.closure',
$closure);
}
//执行闭包函数
protected
function
execClosure($name,
Closure
$closure)
{
echo
'Closure
func
name:'.$name;
echo
'<br>';
$closure('p1',
'p2');
}
在routes.php添加路由:
复制代码
代码如下:Route::get('/test/closure/{t1}/{t2}',['uses'=>'TestController@testClosure']);
访问www.example.com/test/closure/hehe1/hehe2
浏览器输出结果:
Closure
func
name:test.closure
p1p2hehe1hehe2
转自:小谈博客
http://www.tantengvip.com/2016/03/php-closure-use/
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。

㈣ 如何实际使用PHP5.3闭包语法特性

PHP 5.3闭包语法就是一个匿名函数,可以为开发者带来很多不同的体验。与JavaScript的闭包相比稍微有点不同,可以这样使用PHP 5.3闭包语法
$closure = function($param) { echo $param; };

//This one takes value of someVar and "stores" it in the closure's scope even if
//we later change the value of someVar outside it. We assume that $somerVar is defined before this
$closure2 = function($param) use ($someVar) { echo $param . ' ' . $someVar; };
比如PHP 5.3闭包语法在输出HTML中闭包很有用:
function item_list(array $items, $formatter = null) {
//create the default formatter
if($formatter == null) {
$formatter = function($row) {
return '<p>' . $row . '</p>';
};
}

$html = '<h2>Listing:</h2>';
foreach($items as $item) {
$html .= $formatter($item);
}

return $html;
}
以上就是介绍的两种不同的PHP 5.3闭包语法的使用

㈤ php 匿名函数,也叫闭包函数

应该说不对,在 php 中 使用了 use 语句的匿名函数才是闭包函数。php 的变量默认是局部的,没有 use 语句,匿名函数使用不了定义作用域里的变量。只有使用了定义作用域内变量的才能叫闭包函数。

㈥ php闭包函数用use传参有什么意义

PHP语法对于全局变量和局部变量分得太清楚,这里不讨论它好与不好,但确实使用起来比较麻烦。在函数里面调用全局变量,必须global声明以后,才能使用,其它的语言貌似都能直接用。而use在这里的用法,就是解决这个问题的,有时候不但要传参数进来,还要调用局部变量进行计算或判断。举个例子,你也许更明白:

<?php
functiongetMoney($cny){
$usd=6;//这个局部变量,想在闭包里面用,必须放到use里
$func=function($jpy)use($cny){
echo$cny.'<br>';//10
echo$jpy.'<br>';//0.1
echo$usd;//否则就报错,Undefinedvariable:usd
};
$func(0.1);
}
getMoney(10);

㈦ php 使用use 和直接传参的区别

实际应用 1 : 在创建闭包时, 生成所use变量的快照, 下文再次调用闭包函数时, 快照变量不改变
$a = 5;

$b = function ($x) use ($a) {
$a += $x; echo $a;
};

$a = 10; // 这个变量被再次赋值, 但是在use语句中的'快照'是不会改变的

$b(100); // 输出 : 105

实际应用 2 : 使用引用传值, 生成所use变量的指针, 下文再次调用闭包函数时, 快照变量会改变(其实这样做与直接传参已经没有区别, 所以这么做意义不大, 而且代码可读性降低)

$a = 5;

$b = function ($x) use (&$a) {
$a += $x; echo $a;
};

$a = 10; // 变量重新赋值, 上文中闭包所引用的变量值也被改变

$b(100); // 输出 : 110

热点内容
cf弹道脚本 发布:2025-01-26 15:36:40 浏览:54
我的世界花钱买的服务器 发布:2025-01-26 15:34:50 浏览:89
php环境部署 发布:2025-01-26 15:28:09 浏览:17
python实现svm 发布:2025-01-26 15:24:25 浏览:381
易语言写ip全局代理服务器 发布:2025-01-26 15:04:01 浏览:668
gm命令在哪个文件夹 发布:2025-01-26 15:03:12 浏览:307
javadate类 发布:2025-01-26 14:58:54 浏览:352
领航s1配置怎么样 发布:2025-01-26 09:58:10 浏览:763
公司局域网搭建服务器搭建 发布:2025-01-26 09:16:56 浏览:433
android裁剪圆形图片 发布:2025-01-26 09:05:56 浏览:411