草庐IT

php - 使 PHP 闭包函数对 PHP 5.2 安全

以下函数在PHP>5.3中有效,但在旧版本中会出错。我如何修改它以使其在5.2中安全?function_iniloader_get_dirs($dir){$dirs=array_filter(scandir($dir),function($item)use($dir){return(is_dir($dir.'/'.$item)&&$item!="."&&$item!="..");});//Usearray_valuestoresetthearraykeys:returnarray_values($dirs);}5.2错误:Parseerror:syntaxerror,unexpecte

php - PHP <5.3 中的真正闭包

有什么方法可以在PHP中为5.3之前的语言版本编写真正的闭包(因为5.3为匿名函数添加了use关键字)?我是PHP5.3+我可以写:functionmake_adder($x){returnfunction($to)use($x){return$to+$x;};}$add5=make_adder(5);$add5(100);#=>105如何使用这种在函数内部定义函数的模式,并且内部函数可以访问外部函数变量? 最佳答案 在这个简单的例子中,下面的代码会起作用:functionmake_adder($x){returncreate_fu

类实例上的 PHP 闭包

如果我有这样的类(class):classMyClass{publicfunctionfoo(){echo"foo";}}然后在类之外实例化它并尝试在其中创建一个匿名函数:$mine=newMyClass();$mine->bar=function(){echo"bar";}然后尝试像$mine->bar()那样调用它,我得到:Fatalerror:CalltoundefinedmethodMyClass::bar()in...如何在类实例上创建匿名函数/闭包?旁白:在你告诉我我应该重新考虑我的逻辑或正确使用接口(interface)和OOP之前,在我的例子中,它是一个方便的方法,适用

php - 从 PHP 闭包中读取 "this"和 "use"参数

当您在PHP中创建返回闭包的方法时:classExampleClass{publicfunctiontest(){$example=10;returnfunction()use($example){return$example;};}}print_r的结果包含this(其方法创建闭包的类)和static,它似乎是绑定(bind)在其中的值闭包的use()语句:$instance=newExampleClass();$closure=$instance->test();print_r($closure);制作:ClosureObject([static]=>Array([example]

php - 带有闭包的意外 namespace 行为

使用PHP7.0,考虑以下代码:对我来说,预期的输出是:PHPNotice:Undefinedvariable:closure但不知何故结果是B然后考虑下面这段代码:现在知道(但还不了解)第一个示例的行为,我的预期输出是:A但是我得到了PHPParseerror:syntaxerror,unexpected'$closure'(T_VARIABLE),expectingidentifier(T_STRING)这种行为完全让我感到困惑。问题第1部分:有人可以解释一下我在第一个示例中的期望有什么问题吗?问题第2部分:行为如何与第一个示例一致? 最佳答案

php - 使用闭包时如何修复 php 模式缩进

我在Emacs中使用php-mode,当我像这样使用闭包作为参数时它工作正常:$app->get('/',function()use($app){echo"foo";});当函数在函数调用内部时,缩进加倍。如何解决这个问题?编辑如何使它看起来像这样(与javascript模式处理匿名函数相同)。$app->get('/',function()use($app){echo"foo";}); 最佳答案 如果您将点放在第一行的末尾并按C-cC-o,您可以看到cc-mode认为您处于中间的语法结构,并自定义它如何缩进该结构。我当前的计算机上

php - PHP 中的闭包或 create_function

我决定为我的回调使用闭包而不是create_function并且因此只支持PHP>5.3主要是因为增加了可调试性,也因为我假设(他们说的是什么假设?)在我的情况下,create_function的即时编译的开销可能会抵消任何额外的比较,而这些比较必须在函数中进行。这很可能仍然是这种情况(对于我的应用程序)并且需要进一步测试,但我对这个(非常)简单测试的输出很感兴趣,它显示了create_function方法更当它只能删除四个条件(和连接)时,比闭包快两倍。显然,在我的测试用例中没有进行额外的处理,这是大部分速度获得或损失的地方,但在你没有额外处理但有很多条件(可以删除)和回调被调用了足

php - 如何序列化在属性内部有闭包的对象?

如果我执行serialize($obj),我得到:Serializationof'Closure'isnotallowed有什么方法可以在序列化时忽略这些闭包吗?无论如何,当我反序列化字符串时我不需要它们(这些属性的值可以是null或其他)。我的类(class)看起来像这样:ClassNode{protected$attrs=array();}$attrs是一个关联数组,可以包含一些闭包元素,比如$attrs['validator']=function(){...} 最佳答案 很简单:你不能。闭包不可序列化。如果你想创建“类似的东西

php - PHP 5.3 和 5.4 之间的闭包有什么区别?

我在本地运行PHP5.3.15(在OSX上自定义apache/php/mysql堆栈),并且有以下代码,工作正常:$my_closure=function($something,$other)use(&$foo,$bar){//watchadoin'?...stuff.};$my_closure('hello',array('one','two'));一位同事将MAMP与PHP5.4.x结合使用,并在闭包调用($my_closure(...);)中收到“函数名称必须是字符串”错误。我可以使用call_user_func()或call_user_func_array()解决这个问题,但我

php - 调用直接分配给对象属性的闭包

我希望能够直接调用我分配给对象属性的闭包,而无需将闭包重新分配给变量然后再调用它。这可能吗?下面的代码不起作用并导致fatalerror:调用未定义的方法stdClass::callback()。$obj=newstdClass();$obj->callback=function(){print"HelloWorld!";};$obj->callback(); 最佳答案 从PHP7开始,你可以这样做$obj=newStdClass;$obj->fn=function($arg){return"Hello$arg";};echo($o