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
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不同行为问题的更多相关文章
- 深入浅出JavaScript之闭包(Closure)
闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...
- closure
什么是闭包?百度的答案: 闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)."闭包&quo ...
- 使用Google Closure Compiler高级压缩Javascript代码注意的几个地方
介绍 GCC(Google Closure Compiler)是由谷歌发布的Js代码压缩编译工具.它可以做到分析Js的代码,移除不需要的代码(dead code),并且去重写它,最后再进行压缩. 三种 ...
- JavaScript闭包(Closure)
JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...
- 【转】深入浅出JavaScript之闭包(Closure)
闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...
- 学习Javascript闭包(Closure)
闭包作用 1.让变量驻留在内存中 2.函数外部可以读取函数内部的私有变量 <!DOCTYPE html> <html lang="en"> <head ...
- JavaScript闭包(Closure)学习笔记
闭包(closure)是JavaScript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于JavaScript初学者应该是很有用的. 一.变量的作用域 要理解 ...
- PHP 中的Closure
PHP 中的Closure Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函数的定义了. ...
- 如何创建C# Closure ?
JavaScript中一个重要的概念就是闭包,闭包在JavaScript中有大量的应用,但是你知道么?C#也可以创建Closure.下面就介绍一下如何在C#中创建神奇的闭包. 在这之前,我们必须先知道 ...
随机推荐
- Java编程思想(前十章)
Java编程思想 有C++编程基础的条件下, 前10章可以快速过一下,都是基本语法,不需要花太多时间. 着重中后段的一些章节,类型信息.泛型.容器.IO.并发等. 中文翻译版 阅读地址 对于一个架构师 ...
- java各种数据类型的数组元素的默认值
public class DataTypeDefaultValue { public static void main(String[] args) { // string类型数组的默认值null / ...
- SQL CE 和 SQLite数据库对比测试
于项目需要,在客户端需要做数据存储功能,考虑到部署方便同时满足功能需要的情况下选择了SQLCE 和SQLite两种数据库进行客户端数据存储.当然还有很多其他的方式做本地数据存储,比如本地文件存储.微软 ...
- div上下左右居中
链接.father { width: 300px; height:150px; position: relative; } .son { position: absolute; top: 0; rig ...
- PHP斐波那契数列有点不明白有哪位大佬能给讲讲思想以及实现过程
function Fibonacci($n){ if($n <= 0) { return 0; }elseif($n == 1) { ...
- CentOS Linux Jenkins安装、部署、更新
1.安装:https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions2.部署: 注意事项: ...
- bootstrap学习(二)页面
响应式图片: //当图片大的时候,逐渐缩小浏览器大小,图片会显示为自适应大小 ,img-responsive <div class="container"> <d ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- FCC中级算法(上)
在学习FCC中级算法这一块,自己遇到了很多问题,通过RSA也慢慢把问题解决了,发现每一个问题都会有很多的解决思路,因此把自己想到的一些思路记录到这里. 1. Sum All Numbers in a ...
- 【转载】详解一条sql语句的执行过程
转载自 https://www.cnblogs.com/cdf-opensource-007/p/6502556.html SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言 ...