问题标签 [php-closures]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
closures - PHP闭包不能访问parnt函数参数吗?
我一直在为 PHP 5.3 编写一些代码,我想做一些类似于下面显示的代码的事情。我希望这段代码打印“hellohello”,但它会打印“hello”,并出现错误。
看来 $inner 闭包无法访问外部函数的参数。这是正常行为吗?它是一个PHP错误吗?我看不出这怎么能被认为是正确的行为......
谢谢!
php - PHP 5.3.2-1ubuntu4.2 不支持闭包
我刚刚意识到一些 PHP 不能在一台服务器上正确执行,但在另一台服务器上却可以。
他们都运行带有 PHP PHP 5.3.2 的 Ubuntu 10.04(带有 Suhosin-Patch (cli) 的 PHP 5.3.2-1ubuntu4.2(构建时间:2010 年 5 月 13 日 20:03:45))
我正在测试使用:
在工作的服务器上,结果是:
对象(闭包)#1 (0) { }
在没有的情况下,结果是:
未知:0
我错过了什么?
[编辑]
在同一个文件中有 2 个闭包似乎存在问题:
输出:
UNKNOWN:0
对象(闭包)#1 (0) {}
php - 带有 WRITEFUNCTION 回调的并行 cURL 请求
我正在尝试按照以下帖子中的建议限制我的 cURL 响应:Retrieve partial web page and PHP CURLOPT_WRITEFUNCTION doesn't seem to be working。这个想法是将响应限制为回调函数中指定的 4000 个字符。
我编写了以下函数,但我已经知道它没有意义,因为回调函数定义中的参数在循环中不会像在函数调用中那样变化。在实际调用函数时,$key 的值是固定的,所以我对该索引的引用不会改变。
似乎每个循环都需要一个新的闭包函数,每个循环都需要引用自己的 $full_length 变量。但是,我不明白这怎么可能。为了做到这一点,似乎我必须以某种方式引用闭包对象才能指定特定的 $full_length 变量。
任何帮助,将不胜感激。谢谢。
编辑:
我发现一个帖子完全符合我的要求,但它在 javascript: closure inside a for loop - 以循环变量作为参数的回调。我编写了以下函数来尝试在 PHP 中做同样的事情:
代码运行没有错误,但它仍然没有达到我想要的效果。关闭我的 cURL 句柄后,我转储了 $full_length 数组,它只显示:
这表明它们是由 get_write_function 初始化的(因为我没有在类声明中初始化任何东西),但是这些值之后从未更新过。
php - 重构比较/运算符块以干燥并降低 CRAP 级别
我着手围绕一组返回生成器的类(php 5.5)制作一个小项目。
这个小项目的主要动机是扩展我的 TDD 之旅,摆弄生成器,并有一个我可以扔到 packagist 上供以后使用的包。
整个“项目”的当前状态可以在Github找到
所有测试都是绿色的,方法可以满足我的要求。现在我想重构,因为我有很多重复。
该类还有一个名为 getOdd 的方法(是的,它看起来很像;))
主要的重复是闭包$Generator = function() ...
,不同之处主要在于 for 循环中的运算符+ - * /
和参数。这在其余班级中基本相同。
我阅读了 PHP 中的动态比较运算符,得出的结论是没有像这样的本地方法compare(...)
我是否应该使用私有/受保护的方法进行比较。如果是这样,我应该为此创建一个新的类/函数吗?我认为它不属于当前班级。
我还缺少其他东西吗,我不确定如何以适当的方式将其干燥?
顺便提一句。知道一个 getEven,当我得到一个带有 step 函数的 getRange 时,getOdd 有点傻,但这是一个更一般的重构/模式问题。
更新 @github,getEven 和 getOdd 现在已被删除...
zend-framework2 - Zend Framework 2 中的工厂类与闭包
在 Zend Framework 2 中使用工厂类或闭包更好吗?为什么?
我知道闭包不能序列化,但是如果你从 Module#getServiceConfig() 返回它们,这不会影响其余配置数据的缓存,并且闭包无论如何都会缓存在你的操作码缓存中。
构造工厂类与执行闭包的性能有何不同?PHP 是否仅在您执行闭包时包装和实例化闭包,还是会为每个请求的配置文件中定义的每个闭包执行此操作?
有没有人比较过每种方法的执行时间?
也可以看看:
php - lambda 函数和闭包(在 PHP 中)之间的区别?
“Magento PHP 开发人员指南”的第 2 章指出:
Zend Framework 2 使用 100% 面向对象的代码并利用 PHP 5.3 的大部分新特性,即命名空间、后期静态绑定、lambda 函数和闭包。
虽然帖子“闭包”和“lambda”有什么区别?有一些答案(例如,lambda 只是一个匿名函数,而闭包是一个可以访问不在其参数列表中的变量的函数),似乎特定于 Python 编程语言(其中提到了 Scheme编程语言)。例如,根据帖子,在 Python 中,似乎可以有不是 lambda 的闭包和不是闭包的 lambda。
但是,我对 PHP 编程语言感兴趣,而不是 Python。下面的答案之一似乎指出,在 PHP 中,所有闭包都是 lambda,这与与 Python 相关的帖子的内容相冲突。
在我看来,这些概念在不同语言的细节上有所不同,我对 PHP 很感兴趣,因此这篇文章。
所有这一切都令人困惑。虽然我假设 lambda 函数通常只是未命名的函数,但以下 Wikipedia 文章更多地介绍了闭包:
http://en.wikipedia.org/wiki/Closure_%28computer_science%29
尽管在 PHP 中没有示例。
php - 在这种情况下,是否有充分的理由使用闭包而不是 for 循环?
我正在使用 Laravel 4;有问题的模型扩展Eloquent
。
我在两个模型之间建立了关系,listing
并且photo
. 我正在编译一个listings
没有任何对应的集合photos
。Eloquent有一种方便的方法来查找具有相关记录的记录:
我不知道该has
方法的逆存在。如果有,请告诉我。
无论如何,这就是我解决问题的方法:
这工作得很好,但我正在努力扩展我的知识。阅读有关集合的 Laravel 文档,有一个过滤集合的示例:
我使用这种方法重写了我的for
循环:
结果$listings
对象在两种情况下都是相同的。是否有任何令人信服的理由选择一种方法而不是另一种方法,或者仅仅是个人喜好问题?
php - 使用附加数据库根据另一个字段验证字段
我有一个简单的表单,其中包含两个字段,第一个字段只是一个选择,第二个字段包含一个值,需要借助第一个字段进行检查。
我发现了一个基于两个字段的类似问题 Symfony2 表单验证,并尝试使用回调验证器。
我已经阅读了文档,但我不知道如何使用它来访问数据库。
似乎唯一的方法是静态调用验证方法,但在这种情况下,我失去了控制器的上下文。我需要它来访问例如数据库。
在这种关系中,我正在使用 Silex 并希望访问它提供的服务。
该表单未映射到任何类,因此创建自己的约束对我来说看起来是错误的,因为我看不到任何将其他字段传递给验证器的方法。
有没有办法实现它?
还是我需要另一种方法?
php - 在 PHP 中重构闭包/匿名函数
是否可以用这样的代码重构匿名函数:
我试过这个,但它没有回应任何东西:
其他变体给了我语法错误。如果这很重要,我希望将这些函数移动到一个单独的文件中。
这是我的最终目标
回调.php
路由器.php
javascript - PHP 闭包函数:为什么闭包必须是匿名函数?
lambda 或匿名函数只是一个没有名称的函数。
例如
闭包是一个函数,它可以访问未在其参数列表中指定的变量。在 PHP 5.3+ 中,这些变量在 use 关键字之后指定,并在执行闭包函数的函数定义时通过值或引用链接。
例如
在 JavaScript 中,所有函数都是闭包,因为当函数嵌套时,存在一个作用域链,而例如最里面的函数可以访问 1. 它的局部变量,2. 函数在其封闭范围内的局部变量,称为它的闭包作用域,3. 闭包作用域的闭包作用域的局部变量,称为闭包作用域的闭包作用域,...,以此类推,直到我们也可以访问 N. 定义在最高范围。在最内层范围内用 var 声明的变量会掩盖在外层范围内的变量,否则如果最内层变量与在外层范围内的变量同名但未用 var 声明,则使用来自外层范围的变量。
这等效于以下 PHP 代码:
所有这些都在这里描述。
所以我的问题来了。为什么 PHP 中的闭包必须是 lambda 函数?在 JavaScript 中,每个函数都是一个闭包,但不一定是 lambda 函数。那么为什么我们不能在 PHP 中执行以下操作呢?
(致命错误:语法错误,意外的 T_USE,需要 ';' 或 '{')