"Magento PHP Developer's Guide"的第2章指出:
Zend Framework 2使用100%面向对象的代码并利用PHP 5.3的大多数新功能,即命名空间,后期静态绑定,lambda函数和闭包.
虽然帖子'封闭'和'lambda'之间有什么区别?有一些答案(例如,一个lambda只是一个匿名函数,并且一个闭包是一个可以访问不在其参数列表中的变量的函数),似乎特定于Python编程语言(有一些提到Scheme编程语言).例如,根据帖子,在Python中,似乎可以有不是lambdas的闭包,而不是闭包的lambdas.
但是,我对PHP编程语言感兴趣,而不是Python.下面的答案之一似乎指出,在PHP中,所有闭包都是lambdas,这与与Python相关的帖子相冲突.
在我看来,这些概念在语言和语言的细节上有所不同,我对PHP感兴趣,因此这篇文章.
所有这一切都令人困惑.虽然我认为lambda函数通常只是未命名的函数,但下面的维基百科文章更多地讨论了闭包:
http://en.wikipedia.org/wiki/Closure_%28computer_science%29
虽然在PHP中没有例子.
在Zend Framework 2中使用工厂类或闭包更好吗?为什么?
我知道闭包不能被序列化,但如果你从Module#getServiceConfig()返回它们,这不会影响其余配置数据的缓存,并且闭包将被缓存在你的操作码缓存中.
在构建工厂类与执行闭包时,性能有何不同?PHP是否仅在执行时包装和实例化闭包,或者它是否会在每个请求中为配置文件中定义的每个闭包执行此操作?
有没有人比较过每种方法的执行时间?
也可以看看:
我有一个正在传递闭包的函数。我想找出闭包派生自的方法的名称。当我调用print_r时,它输出:
Closure Object
(
[static] => Array
(
[listener] => Event_Subscriber_Calq@vendor_product_created
[container] => Illuminate\Foundation\Application Object
...
Run Code Online (Sandbox Code Playgroud)
我如何访问该侦听器值?我试过 ->static、::$static、getStatic(),我想不出任何方法来获取值。
目前,我的计划是使用输出缓冲来捕获 var_dump 的输出。我不能为此使用 print_r,因为闭包包含对引用自身的对象的引用,而 print_r 需要很长时间来处理递归。我也不能使用 var_export,因为它没有在输出中包含我想要的值。所以,这是我的解决方案:
ob_start();
var_dump($closure);
$data = ob_get_clean();
$data = preg_replace('#^([^\n]*\n){4}#', '', $data);
$data = preg_replace('#\n.*#', '', $data);
$data = preg_replace('#.*string.[0-9]+. "(.*)".*#', '\1', $data);
list($class, $method) = explode('@', $data);
Run Code Online (Sandbox Code Playgroud)
这是可怕的。有没有另一种方法可以做到这一点?也许使用反射?
我一直在为PHP 5.3编写一些代码,我想做类似于我在下面显示的代码.我希望这段代码可以打印'hellohello',但它打印'hello'而不是错误.
看来$ inner闭包不能访问外部函数的参数.这是正常的行为吗?这是一个PHP错误吗?我看不出这怎么可能被认为是正确的行为......
<?php
function outer($var) {
print $var;
$inner = function() {
print $var;
};
$inner();
}
outer('hello');
Run Code Online (Sandbox Code Playgroud)
谢谢!
use 带有 php 闭包的关键字是将精选变量的范围扩展到闭包的一种非常清晰的方法。
如果我们需要从闭包中更新调用者函数作用域中某个变量的值,有什么办法吗?
$total_strength = 0;
$all_cores->each(function($core) use ($total_strength) {
$total_strength += $code->strength;
});
print('Cumulative cores' strength is: ' . $total_strength);
Run Code Online (Sandbox Code Playgroud)
在这里我总是得到 0。如何解决这个问题?
我有一个遍历数组的foreach循环,并以雄辩的方式保存数据.它是这样的:
foreach($questions['questions'] as $question) {
$questionObject = Question::create([
'external_id' => $question['id'],
'text' => $question['question_text'],
'type' => $question['question_type'],
'image' => (array_key_exists('question_image', $question)) ?
$question['question_image'] : ''
]);
}
Run Code Online (Sandbox Code Playgroud)
但是当我添加if条件时我得到未定义的变量问题错误.
foreach($questions['questions'] as $question) {
if(!$question = Question::where('id', $question['id'])->where(
function($query){
$query->where('updated_at','<', $question['updated']);
}})->first()) {
$questionObject = Question::create([
'external_id' => $question['id'],
'text' => $question['question_text'],
'type' => $question['question_type'],
'image' => (array_key_exists('question_image', $question)) ?
$question['question_image'] : ''
]);
} else {
return 'Question: '.$question['external_id'].' already exist.';
}
}
Run Code Online (Sandbox Code Playgroud)
如果有任何可以帮助我,非常感谢,提前谢谢!