PHP 7.2禁止类名为Object的巨坑
PHP 7.2禁止类名为Object的巨坑
2018年1月4日PHP 7.2.1
发布,很多之前处于观望的小伙伴开始打算升级PHP
了,不过要注意到2017年11月30日发布的PHP 7.2.0
开始禁止类名为Object
,这将导致很多包出错。特别是很多包的兼容性只写了最低版本,没有写最高版本,使用PHP 7.2
的时候composer
并不会提示兼容性错误,而PHP
的autoload
的延迟加载特性,又会导致仅在涉及的时候才会提示错误。例如这样的场景:
程序使用框架F
,使用第三方模块M
,而模块M
中在特定参数的情况会调用模块N
,模块N
中包含一个类名为Object
的类。在开发的时候,模块N
并不会涉及到,因此在PHP 7.2
中开发很久也不会遇到这个问题。可是给客户部署的时候,出现了使用模块N
的情况。
这时候,如果降级到PHP 7.1
,那么程序中已经大量使用的PHP 7.2
的特性就都需要修改,特别是禁止类名使用Object
的特性的根源——Object
类型提示,就全部要修改,而且需要增加相应的程序判断。
如果不降级,那么就需要修改模块N
中所有涉及到Object
的地方,程序员都知道修改别人的代码多么痛苦。
最后说说这个坑。
PHP 7.2.0 Released 中包含 Object typehint 对象类型提示 ,其中提到 Backward Incompatible Changes 向后兼容变更
Although ‘object’ is already a soft reserved word, this RFC adds object as fully reserved classname.
从这里可以看出,object
一直是一个软soft
保留字,程序中本来就不应该使用,这次只不过变成了完全保留字而已。
例如 yii2 也做了修改 https://github.com/yiisoft/yii2/blob/master/framework/base/Object.php
尽管这么大的坑,不过好处也多多,官方给出的例子如下:
参数类型
function acceptsObject(object $obj) {...
}// This code can be statically analyzed to be correct
acceptsObject(json_decode('{}'));// This code can be statically analyzed to be correct
acceptsObject(new \MyObject());// This can be statically analysed to contain an error.
// and would throw an TypeError at runtime.
acceptsObject("Ceci n'est pas une object.");
返回类型
// This function can be statically analysed to conform to the
// return type
function correctFunction() : object {$obj = json_decode('{}');return $obj;
}// This function can be statically analysed to contain an error
// and will also fail at runtime.
function errorFunction() : object {return [];
}
转换器和数据解析器
interface Hydration {// Hydrate an object by populating datapublic function hydrate(array $data, object $object) : object;
}interface Extraction {// Extract values from an objectpublic function extract(object $object) : array;
}
服务容器和依赖注入容器
interface ServiceContainer {// Set service definitionpublic function set(string $id, object $service);// Retrieve service object from containerpublic function get(string $id) : object;
}
捕获返回值错误
function unserialize($data) : object {$type = $data['type'];switch ($type) {case 'foo': { return new Foo(); }case 'bar': { return new Bar(); }case 'zot': { new zot(); } // Ooops, this is an error}
}
继承中强制函数签名
class WidgetFactory {function create() : object {return new Widget();}
}class CustomWidgetFactory extends WidgetFactory {// This class would not compile, as the signature of the metod in// the child class is not compatible with the method signature in // the parent class.function create() : bool {...}
}
参数类型提示逆变
class Foo {}class Bar {public function foo(Foo $object) : object {return $object;}
}class Baz extends Bar {public function foo(object $object) : object {return $object; }
}
返回值类型协变
class Foo {}class Bar {public function foo(object $object) : object {return $object;}
}class Baz extends Bar {public function foo(object $object) : Foo {return $object; }
}
PHP 7.2禁止类名为Object的巨坑相关推荐
- js 正则表达式禁止输入框输入特殊字符遇到的坑以及解决方案
前言 最近在项目中有一个需求是禁止输入特殊字符,一开始我是在网上找的正则表达式直接用的,后来发现这个表达式同时也禁止了v,x,y,z,所以后来就想了一个比较笨的方法,把所有的特殊字符全部罗列出来,然后 ...
- 新网银行金融科技挑战赛 AI算法赛道 亚军方案
比赛链接:https://www.kesci.com/home/competition/5ee1f35f73aef4002c76ef3b 代码获取方式:关注公众号 ChallengeHub 回复&qu ...
- gettype获取类名_在TypeScript中运行时获取对象的类名
在TypeScript中运行时获取对象的类名 是否可以使用typescript在运行时获取对象的类/类型名称? class MyClass{} var instance = new MyClass() ...
- JS-面向对象-对象的特性-禁止对象扩展 / 对象的特性-封印对象 / 对象的特性-冻结对象
对象的特性-禁止对象扩展 <!DOCTYPE html> <html lang="zh"><head><meta charset=&quo ...
- php object 对象不存在。增加对象_PHP开发自己的框架,这些知识点不能错过
一.PHP常用的四种数据结构 简介:spl是php的一个标准库. <?php//spl(php标准库)数据结构/*** 栈(先进后出)*/ $stack = new SplStack(); $s ...
- 关于javascript,[object,object]是什么?
关于javascript,[object,object]是什么? 2009-07-19 11:10 遗忘之花再开时 | 浏览 22221 次 编程语言 alert(对象)的时候 页面弹出的就是 ...
- java 字符串是类名.class 如何实例化_根据类名字符串实例化类,并调用类的方法或函数 转...
//获取类型信息 //如果调用其他的DLL //System.Reflection.Assembly asmb = System.Reflection.Assembly.LoadFrom(" ...
- JavaScript经典案例:添加/删除元素类名
效果展示: CSS代码: <style type="text/css">#btn-wrapper {width: 300px;height: 100px;text-al ...
- await把Promise解析为普通对象,async函数return的返回值是promise对象,await后转化为普通Object
async函数return的是Promise,await Promise后得到Object 文章目录 前言 1.函数return的返回值Object,await后得到的是Object 2.async函 ...
最新文章
- jsp页面中静态文件的时间戳
- 如何启用计算机超级账户,Windows7启用超级管理员账户的方法
- git如何上传所有的新文件
- 华思视频 CCNA 听而思
- php基础教程 第七步数组补充及循环基础
- 《一段代码告诉你,Python的正则表达式怎么用》
- 向android模拟器中复制文件报out of memory错误解决
- linux系统下UTF-8转GBK编码,使用汉字字库在LCD显示汉字
- 草图大师2021安装教程(超详细图文教程)
- 【Codecs系列】AVS+(AVS1 P16)解码器
- 车牌识别EasyPR--开发详解
- 拉拉米抢单发单源码 二开ui 带视频介绍 放量功能
- Java中的IO、NIO、File、BIO、AIO详解
- 悦联 android auto,马自达6兼容Apple CarPlay和Android Auto系统 三款车载屏幕吸睛
- sourceTree 完全卸载
- 考研三年,做了同传,迎娶白富美,实现财务自由。这是真鸡汤!
- 最全中文3DMAX四边形散布插件QuadScatter使用教程
- 探查 JDBC 故障【转载】
- DELL戴尔官方恢复介质镜像下载与安装教程
- python伪代码的写法_伪代码的写法