PHP 7.2禁止类名为Object的巨坑

2018年1月4日PHP 7.2.1发布,很多之前处于观望的小伙伴开始打算升级PHP了,不过要注意到2017年11月30日发布的PHP 7.2.0开始禁止类名为Object,这将导致很多包出错。特别是很多包的兼容性只写了最低版本,没有写最高版本,使用PHP 7.2的时候composer并不会提示兼容性错误,而PHPautoload的延迟加载特性,又会导致仅在涉及的时候才会提示错误。例如这样的场景:
程序使用框架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的巨坑相关推荐

  1. js 正则表达式禁止输入框输入特殊字符遇到的坑以及解决方案

    前言 最近在项目中有一个需求是禁止输入特殊字符,一开始我是在网上找的正则表达式直接用的,后来发现这个表达式同时也禁止了v,x,y,z,所以后来就想了一个比较笨的方法,把所有的特殊字符全部罗列出来,然后 ...

  2. 新网银行金融科技挑战赛 AI算法赛道 亚军方案

    比赛链接:https://www.kesci.com/home/competition/5ee1f35f73aef4002c76ef3b 代码获取方式:关注公众号 ChallengeHub 回复&qu ...

  3. gettype获取类名_在TypeScript中运行时获取对象的类名

    在TypeScript中运行时获取对象的类名 是否可以使用typescript在运行时获取对象的类/类型名称? class MyClass{} var instance = new MyClass() ...

  4. JS-面向对象-对象的特性-禁止对象扩展 / 对象的特性-封印对象 / 对象的特性-冻结对象

    对象的特性-禁止对象扩展 <!DOCTYPE html> <html lang="zh"><head><meta charset=&quo ...

  5. php object 对象不存在。增加对象_PHP开发自己的框架,这些知识点不能错过

    一.PHP常用的四种数据结构 简介:spl是php的一个标准库. <?php//spl(php标准库)数据结构/*** 栈(先进后出)*/ $stack = new SplStack(); $s ...

  6. 关于javascript,[object,object]是什么?

    关于javascript,[object,object]是什么? 2009-07-19 11:10 遗忘之花再开时  |  浏览 22221 次   编程语言 alert(对象)的时候 页面弹出的就是 ...

  7. java 字符串是类名.class 如何实例化_根据类名字符串实例化类,并调用类的方法或函数 转...

    //获取类型信息 //如果调用其他的DLL //System.Reflection.Assembly asmb = System.Reflection.Assembly.LoadFrom(" ...

  8. JavaScript经典案例:添加/删除元素类名

    效果展示: CSS代码: <style type="text/css">#btn-wrapper {width: 300px;height: 100px;text-al ...

  9. await把Promise解析为普通对象,async函数return的返回值是promise对象,await后转化为普通Object

    async函数return的是Promise,await Promise后得到Object 文章目录 前言 1.函数return的返回值Object,await后得到的是Object 2.async函 ...

最新文章

  1. jsp页面中静态文件的时间戳
  2. 如何启用计算机超级账户,Windows7启用超级管理员账户的方法
  3. git如何上传所有的新文件
  4. 华思视频 CCNA 听而思
  5. php基础教程 第七步数组补充及循环基础
  6. 《一段代码告诉你,Python的正则表达式怎么用》
  7. 向android模拟器中复制文件报out of memory错误解决
  8. linux系统下UTF-8转GBK编码,使用汉字字库在LCD显示汉字
  9. 草图大师2021安装教程(超详细图文教程)
  10. 【Codecs系列】AVS+(AVS1 P16)解码器
  11. 车牌识别EasyPR--开发详解
  12. 拉拉米抢单发单源码 二开ui 带视频介绍 放量功能
  13. Java中的IO、NIO、File、BIO、AIO详解
  14. 悦联 android auto,马自达6兼容Apple CarPlay和Android Auto系统 三款车载屏幕吸睛
  15. sourceTree 完全卸载
  16. 考研三年,做了同传,迎娶白富美,实现财务自由。这是真鸡汤!
  17. 最全中文3DMAX四边形散布插件QuadScatter使用教程
  18. 探查 JDBC 故障【转载】
  19. DELL戴尔官方恢复介质镜像下载与安装教程
  20. python伪代码的写法_伪代码的写法

热门文章

  1. heroku 部署nodejs+mongodb
  2. 火车运输java_基于jsp的火车售票-JavaEE实现火车售票 - java项目源码
  3. DBLP 搜索爬虫项目
  4. 如192.168.1.10/27 IP斜杠后面的27是什么意思?
  5. Eclipse里面web项目上面的小地球消失的原因
  6. 贴片电阻常规尺寸及功率
  7. java 字符串和16进制的相互转换
  8. osmosis抽取PBF矢量数据,导出xml格式数据
  9. Altium中PCB导入二维码
  10. 麦金塔下载Adobe系列