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

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

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

  

 public function addRule(RuleInterface $routeRule, \Closure $callback)
{ if (false !== $callbackClosure = $callback->bindTo($routeRule, $routeRule)) {
$routeRule->setCallback($callbackClosure);
} else {
throw new InvalidRuleCallbackException('invalid callback closure specified!');
} if (!$routeRule->isTerminable()) {
array_unshift($this->_rules, $routeRule);
} else {
$this->_rules[] = $routeRule;
} return self::$_instance;
}

  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下就不报错了:

 

 public function addRule(RuleInterface $routeRule, \Closure $callback)
{
// must bind as a static Closure, otherwise will raise: Warning: Cannot bind an instance to a static closure(v5.x)
if (false !== $callbackClosure = \Closure::bind($callback, null, $routeRule)) {
$routeRule->setCallback($callbackClosure);
}
/*if (false !== $callbackClosure = $callback->bindTo($routeRule, $routeRule)) {
$routeRule->setCallback($callbackClosure);
}*/ else {
throw new InvalidRuleCallbackException('invalid callback closure specified!');
} if (!$routeRule->isTerminable()) {
array_unshift($this->_rules, $routeRule);
} else {
$this->_rules[] = $routeRule;
} return self::$_instance;
}

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

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

  1. 深入浅出JavaScript之闭包(Closure)

    闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...

  2. closure

    什么是闭包?百度的答案: 闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)."闭包&quo ...

  3. 使用Google Closure Compiler高级压缩Javascript代码注意的几个地方

    介绍 GCC(Google Closure Compiler)是由谷歌发布的Js代码压缩编译工具.它可以做到分析Js的代码,移除不需要的代码(dead code),并且去重写它,最后再进行压缩. 三种 ...

  4. JavaScript闭包(Closure)

    JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...

  5. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  6. 【转】深入浅出JavaScript之闭包(Closure)

    闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...

  7. 学习Javascript闭包(Closure)

    闭包作用 1.让变量驻留在内存中 2.函数外部可以读取函数内部的私有变量 <!DOCTYPE html> <html lang="en"> <head ...

  8. JavaScript闭包(Closure)学习笔记

    闭包(closure)是JavaScript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于JavaScript初学者应该是很有用的. 一.变量的作用域 要理解 ...

  9. PHP 中的Closure

    PHP 中的Closure Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函数的定义了. ...

  10. 如何创建C# Closure ?

    JavaScript中一个重要的概念就是闭包,闭包在JavaScript中有大量的应用,但是你知道么?C#也可以创建Closure.下面就介绍一下如何在C#中创建神奇的闭包. 在这之前,我们必须先知道 ...

随机推荐

  1. git知识总结-3.gitignore文件说明

    1.前言 一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表. 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等. 在这种情况下,我们可以创建一个名 ...

  2. Mac本地搭建kubernetes环境

    前言:之前在windows上面的虚拟机上面手工搭建了kubernetes集群,但是环境被破坏了,最近想要继续学习k8s,手工搭建太费事,所以选择了minikube,完全能够满足个人的需求,其实在Win ...

  3. php递归实现一维数组转为指定树状结构 --- 省市区处理

    ### 这两天脑壳痛,一时短路,想不到准备利用递归实现这个需求,最后还是要请教同事,回来自己在实现了一遍,并记录下来 ### 原数据: // { // 广东省: { // 广州市: [ // &quo ...

  4. HTML5画布小dome八卦图

      <!DOCTYPE html>   <html>   <head>   <meta charset="utf-8" />   & ...

  5. python的学习之路(一)

    1.python的简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  6. md

    > 引用# 一级标题## 二级标题,总共六级标题 - ul + li + li 1. 1232. 456 [链接](http://www.baidu.com) ![图片](http://plac ...

  7. lxml爬取实验

    1.豆瓣 爬取单个页面数据 import requests from lxml import etree #import os url = "https://movie.douban.com ...

  8. eclipse 开发环境问题

    1.jdk安装,环境变量设置.主要有两个: JAVA_HOME   C:\Program Files\Java\jre7 JRE_HOME   C:\Program Files\Java\jre7 2 ...

  9. js实现页面重新加载

    https://blog.csdn.net/wangjian530/article/details/80596801

  10. 安装jar包到maven仓库

    1)将所要安装的jar包放在自定义目录下. 2)(maven环境变量配置无误的情况下)windows环境下,打开命令提示符,输入如下命令: mvn install:install-file -Dfil ...