PHP版本
PHP7.2.x版本特性
# 新特性 #### 1. 新的对象类型 这种新的对象类型, object, 引进了可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型。 ```php <?php function test(object $obj) : object{ return new SplQueue(); } test(new stdClass()); ``` #### 2. 通过名称加载扩展 扩展文件不再需要通过文件加载 (Unix下以.so为文件扩展名,在Windows下以 .dll 为文件扩展名) 进行指定。可以在php.ini配置文件进行启用, 也可以使用 dl() 函数进行启用。 #### 3. 重写抽象方法(Abstract method) 当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。 ```php <?php abstract class A{ abstract function test(string $s); } abstract class B extends A{ // 被覆盖 - 仍然保持参数的逆变和返回的逆变 abstract function test($s) : int; } ``` #### 4. Sodium 现在是核心扩展 现代 Sodium 加密类已经成为 PHP 核心扩展。 #### 5. 使用 Argon2 算法生成密码散列 Argon2 已经加入到密码散列 API #### 6. 新增 PDO 字符串扩展类型 当你准备支持多语言字符集,PDO的字符串类型已经扩展支持国际化的字符集。以下是扩展的常量: PDO::PARAM_STR_NATL PDO::PARAM_STR_CHAR PDO::ATTR_DEFAULT_STR_PARAM #### 7. 为 PDO 新增额外的模拟调试信息 PDOStatement::debugDumpParams()方法已经更新,当发送SQL到数据库的时候,在一致性、行查询(包括替换绑定占位符)将会显示调试信息。这一特性已经加入到模拟调试中(在模拟调试打开时可用)。 #### 8. Socket 扩展添加了地址信息 Socket 扩展现在具有查找地址信息的能力,且可以连接到这个地址,或者进行绑定和解析。为此添加了以下一些函数: socket_addrinfo_lookup() socket_addrinfo_connect() socket_addrinfo_bind() socket_addrinfo_explain() #### 9. 扩展了参数类型 重写方法和接口实现的参数类型现在可以省略了。不过这仍然是符合LSP,因为现在这种参数类型是逆变的。 ```php <?php interface A{ public function Test(array $input); } class B implements A{ public function Test($input){} // type omitted for $input } ``` #### 10. 允许分组命名空间的尾部逗号 命名空间可以在PHP 7中使用尾随逗号进行分组引入。 ```php <?php use Foo\Bar\{ Foo, Bar, Baz, }; ``` #### 11. ZIP 扩展增强 新增加密归档读写支持(需要 libzip 1.2.0)。 现在 ZipArchive 类实现了 Countable 接口。 zip:// 流现在接受 'password' 上下文选项。 # 不向下兼容的变更 #### 1. 防止 number_format() 返回负零 之前版本中,number_format() 有可能会返回 -0。虽然这是符合 IEEE 754 规范的,但是这样会导致可读性不好,新版本中会将这样的负数去掉。 ```php <?php var_dump(number_format(-0.01)); // 新版本输出 string(1) "0" 旧版本输出 string(2) "-0" ``` #### 2. 转换对象和数组中的数字键 将数组转换为对象,或将对象转换为数组时,数字键现在得到了更好的处理(无论是通过显式转换还是通过 settype() 函数)。这意味着现在可以访问数组中的整数(或者说是字符串整数)键,这些键会映射到对象中: ```php <?php // array to object $arr = [0 => 1]; $obj = (object)$arr; var_dump( $obj, $obj->{'0'}, // 新写法 $obj->{0} // 新写法 ); // object to array $obj = new class { public function __construct() { $this->{0} = 1; } }; $arr = (array)$obj; var_dump( $arr, $arr[0], // 新写法 $arr['0'] // 新写法 ); ``` #### 3. get_class() 函数不再接受 null 参数 之前版本中,传递 null 给 get_class() 函数将返回当前类名。在新版本中,此行为会抛出一个 E_WARNING 错误。如果想实现与之前版本同样的效果,请不要传递任何参数进来。 #### 4. gettype() 在闭包资源中的返回值 之前版本中,如果在一个闭包资源中使用 gettype() 会返回字符串 "unknown type",现在将会返回字符 "resource (closed)"。 #### 5. 提升未定义常量的错误级别 调用未定义的常量,现在会抛出一个 E_WARNING 错误(之前版本中为 E_NOTICE)。在下一个 PHP 大版本中,将会抛出一个 Error 错误。 # PHP 7.2.x 中废弃的功能 #### 1. 不带引号的字符串 不带引号的字符串是不存在的全局常量,转化成他们自身的字符串。 在以前,该行为会产生 E_NOTICE,但现在会产生 E_WARNING。在下一个 PHP 主版本中,将抛出 Error 异常。 ```php <?php var_dump(NONEXISTENT); ``` #### 2. png2wbmp() 和 jpeg2wbmp() GD 扩展内的 png2wbmp() 和 jpeg2wbmp() 现已被废弃,将在下一个 PHP 主版本中移除。 #### 3. __autoload() 方法 _\_autoload() 方法已被废弃, 因为和 spl_autoload_register() 相比功能较差 (因为无法链式处理多个 autoloader), 而且也无法在两种 autoloading 样式中配合使用。 #### 4. (unset) 类型强制转化 转化任意表达式为此类型,结果总是 null,所以这个多余的类型转化现在也就被废弃了。 #### 5. parse_str() 不加第二个参数 使用 parse_str() 时,不加第二个参数会导致查询字符串参数导入当前符号表。 考虑到安全隐患问题,不加第二个参数使用 parse_str() 的行为已被废弃。 此函数的第二个选项为必填项,它使查询字符串转为 Array。 #### 6. gmp_random() 函数 此函数基于未知的、取决于平台的 limb 尺寸产生随机数。因此,该函数已被废弃。 使用更好的方式产生随机数: GMP 扩展中的 gmp_random_bits() 和 gmp_random_range()。 #### 7. each() 函数 使用此函数遍历时,比普通的 foreach 更慢, 并且给新语法的变化带来实现问题。因此它被废弃了。 #### 8. assert() 一个字符串参数 assert() 字符串参数将要求它能被 eval() 执行。 考虑到可能被执行远程代码,废弃了字符串的 assert(),最好提供 bool 的表达式。 #### 9. 错误处理器内的 $errcontext 参数 $errcontext 参数包含了错误网站的所有本地变量。 考虑到它很少被用到,而且还会导致内部优化问题,它现在被废弃了。 代替用法:调试器应该自己取回错误站点的本地变量。 #### 10. read_exif_data() 函数 read_exif_data() 别名已被废弃 使用 exif_read_data() 函数代替。
顶部
收展
底部
[TOC]
目录
关于VC和线性安全的选择
PHP5.6版本
PHP6版本去哪儿了?
PHP7.0.x版本特性
PHP7.1.x版本特性
PHP7.2.x版本特性
PHP7.3.x版本特性
PHP7.4.x版本特性
PHP8.0.x版本特性
PHP8.1.x版本特性
相关推荐
PHP基础
PHP函数
PHP设计模式
PHP算法