PHP 5.x和PHP 7 Closure不同行为问题

  同样一段闭包代码,PHP 7 ok的,PHP 5.5.11(Windows 开发机器)上却报错,以为是PHP 5 bug,原来是用法不对,记录一下~

  原代码(自己写的框架的路由部分)最初是这样写的:

  完整代码地址: https://github.com/TF-Joynic/Hydrogen/blob/master/lib/Hydrogen/Route/Router.php

  

 1 public function addRule(RuleInterface $routeRule, \Closure $callback)
 2     {
 3
 4         if (false !== $callbackClosure = $callback->bindTo($routeRule, $routeRule)) {
 5             $routeRule->setCallback($callbackClosure);
 6         } else {
 7             throw new InvalidRuleCallbackException(‘invalid callback closure specified!‘);
 8         }
 9
10         if (!$routeRule->isTerminable()) {
11             array_unshift($this->_rules, $routeRule);
12         } else {
13             $this->_rules[] = $routeRule;
14         }
15
16         return self::$_instance;
17     }

  PHP 7下面跑却是没有问题

  但是5.5.11下运行的时候,第4行直接抛 Warning: Cannot bind an instance to a static closure

    传进来的 $callback Closure 实际是:

  

function (Request $request, Response $response) {}

  

  初步判断在5.5环境下PHP认为它是一个static function,而PHP 7下跑的时候可能就认为是普通function

  修改代码,以static 的方式bind闭包,php 5下就不报错了:

 

 1 public function addRule(RuleInterface $routeRule, \Closure $callback)
 2     {
 3         // must bind as a static Closure, otherwise will raise: Warning: Cannot bind an instance to a static closure(v5.x)
 4         if (false !== $callbackClosure = \Closure::bind($callback, null, $routeRule)) {
 5             $routeRule->setCallback($callbackClosure);
 6         }
 7         /*if (false !== $callbackClosure = $callback->bindTo($routeRule, $routeRule)) {
 8             $routeRule->setCallback($callbackClosure);
 9         }*/ else {
10             throw new InvalidRuleCallbackException(‘invalid callback closure specified!‘);
11         }
12
13         if (!$routeRule->isTerminable()) {
14             array_unshift($this->_rules, $routeRule);
15         } else {
16             $this->_rules[] = $routeRule;
17         }
18
19         return self::$_instance;
20     }

  具体是不是上述原因有待细究……

时间: 2024-08-01 00:46:36

PHP 5.x和PHP 7 Closure不同行为问题的相关文章

学习Javascript闭包(Closure)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外

聊一下JS中的作用域scope和闭包closure

scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久,无论看别人如何解释,就是不通.不过理越辩越明,代码写的多了,小程序测试的多了,再回过头看看别人写的帖子,也就渐渐明白了闭包的含义了.咱不是啥大牛,所以不搞的那么专业了,唯一的想法就是试图让你明白什么是作用域,什么是闭包.如果看了这个帖子你还不明白,那么多写个把月代码回过头再看,相信你一定会有收获:如果看这个帖子让你收获到了一些东西,告诉我,还是非常

javascript Closure 闭包

引用自 http://www.cnblogs.com/mguo/archive/2013/06/19/3143880.html /*一.变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量.*/ var n=999; function f1(){ alert(n); } f1(); // 999//另一方面,在函数外部自然无法读取函数内的局部变量. funct

Swift闭包(Closure)

语法: { (parameters) ->return type in statements} 实例:采用函数实现: let names =["Chris", "Alex", "Ewa", "Barry", "Daniella"] funcbackwards(s1: String, s2: String) -> Bool { return s1 > s2 } var reversed =

Swift 闭包(closure)

Swift中的闭包,就是Objective-C中的Block, 其实两者是一个东西 1.Closure变量的声明 (1)Closure就是匿名函数,我们可以定义一个闭包变量,而这个闭包变量的类型就是我们上面介绍的“函数类型”. 定义一个闭包变量其实就是定义一个特定函数类型的变量,方式如下. 因为Closure变量没有赋初始值,所以我们把其声明为可选类型的变量.在使用时,用!强制打开即可. var myCloure0:((Int, Int) -> Int)? (2)我们还用另一种常用的声明闭包变量

python 闭包(closure)

闭包的定义: 闭包就是一个函数,这个函数可以记住封闭作用域里的值,而不管封闭作用域是否还在内存中. 来一个例子: def happy_add(a): print 'id(a): %x' % id(a) def do_add(b): return a + b print 'id(do_add): %x' % id(do_add) return do_add test_one = happy_add(1) test_one(9) print repr(test_one) print '\n-----

Apache Commons Collections基本操作(Predicate、Transformat、Closure等)

一.Predicate断言 package Collections; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.PredicateUtils; import org.apache.commons.collections4.functors.EqualPredic

javascript 闭包(closure)

<script type="text/javascript">    //闭包(closure):内层函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经结束    //注意内层函数引用的外层函数内的变量是外层函数执行结束后的最终值    test(1);    function test(a) { //外层函数        alert(a+' 外层函数开始执行');        setTimeout(function(){//内层函数           

Swift语言精要-闭包(Closure)

闭包(Closure)这个概念如果没学过Swift的人应该也不会陌生. 学过Javascript的朋友应该知道,在Javascript中我们经常会讨论闭包,很多前端工程师的面试题也会问到什么是闭包. 那么,什么是闭包呢? 让我们看下在Javascript中闭包的解释: Closures are functions that have access to variables from another function’s scope. (This is often accomplished by

JavaScript 的closure 和 hoisting

闭包(closure) 当声明一个函数时,其内部的变量的声明也在它的scope中被截获.比如下面的代码中,变量 x 绑定到了外部scope的值,然后对 x 的引用在bar的上下文中被截获. var x = 4; // declaration in outer scope function bar() { console.log(x); // outer scope is captured on declaration } bar(); // prints 4 to console "截获&quo