PHP版本
PHP7.4.x版本特性
#新特性 #### 1. 属性添加限定类型 类的属性中现在支持添加指定的类型。 ```php <?php class User { public int $id; public string $name; } ``` #### 2. 箭头函数 箭头函数 提供了一种更简洁的定义函数的方法。 ```php <?php $factor = 10; $nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]); // $nums = array(10, 20, 30, 40); ``` #### 3. 有限返回类型协变与参数类型逆变 只有在使用自动加载的情况下,才会有完整的差异支持。在一个文件内,只有非循环类型引用是可能的,因为在引用之前,所有的类都需要可用。 ```php <?php class A {} class B extends A {} class Producer { public function method(): A {} } class ChildProducer extends Producer { public function method(): B {} } ``` #### 4. 空合并运算符赋值 ```php <?php $array['key'] ??= computeDefault(); // 等同于以下旧写法 if (!isset($array['key'])) { $array['key'] = computeDefault(); } ``` #### 5. 数组展开操作 ```php <?php $parts = ['apple', 'pear']; $fruits = ['banana', 'orange', ...$parts, 'watermelon']; // ['banana', 'orange', 'apple', 'pear', 'watermelon']; ``` #### 6. 数值文字分隔符 数字文字可以在数字之间包含下划线。 ```php <?php 6.674_083e-11; // float 299_792_458; // decimal 0xCAFE_F00D; // hexadecimal 0b0101_1111; // binary ``` #### 7. 弱引用 弱引用允许程序员保留对对象的引用,但不会阻止销毁对象。 #### 8. 允许从 __toString() 抛出异常 现在允许从 _\_toString() 抛出异常。之前的版本,将会导致一个致命错误。新版本中,之前发生致命错误的代码,已经被转换为 Error 异常。 #### 9. CURL 如果扩展是使用 libcurl >= 7.56.0 构建的,CURLFile 现在除了支持普通文件名之外还支持流封装协议。 #### 10. Filter FILTER_VALIDATE_FLOAT 过滤器现在支持 min_range 和 max_range 选项,其含义跟 FILTER_VALIDATE_INT 相同。 #### 11. FFI FFI 是新扩展,提供了简单的方式去 C 库中调用原生函数、访问原生变量和创建和访问定义的数据结构。 #### 12. GD 添加 IMG_FILTER_SCATTER 图片过滤器以将分散过滤器(scatter filter)应用于图片。 #### 13. 多字节字符串 新增 mb_str_split() 函数,提供了跟 str_split() 相同的行为,但是在代码点上操作,而不是字节。 #### 14. 正则表达式(兼容 Perl) preg_replace_callback() 和 preg_replace_callback_array() 函数现在接受附加的 flags 参数,支持 PREG_OFFSET_CAPTURE 和 PREG_UNMATCHED_AS_NULL flag。这会影响传递给回调函数的匹配数组的格式 #### 16. PDO 现在可以将用户名和密码指定为 mysql、mssql、sybase、dblib、firebird 和 oci 驱动程序的 PDO DSN 的一部分。之前仅支持 pgsql 驱动程序。如果在构造函数和 DSN 中都指定了,则优先使用构造函数中的用户名/密码。 现在可以在 SQL 查询中转义问号,以避免解释为参数占位符。编写? 将会向数据库发送一个问号,例如使用 PostgreSQL JSON 键中存在(?)运算符。 #### 17. 带标签数组的 strip_tags() strip_tags() 现在接受允许的标签数组:现在可以编写 strip_tags($str, ['a', 'p']) 代替 strip_tags($str, '<a><p>')。 #### 18. 自定义对象序列化 新增自定义对象序列化的新机制,使用两种新魔术方法:_\_serialize 和 _\_unserialize。新的序列化机制取代了 Serializable 接口,并且将会在未来弃用。 ```php <?php // 返回数组,包含对象所有必要的状态。 public function __serialize(): array; // 从指定的数据数组中回复对象状态。 public function __unserialize(array $data): void; ?> ``` #### 19. 不带参数的数组合并函数 现在可以不带任何参数调用 array_merge() 和 array_merge_recursive(),此时会返回空数组。这跟展开运算符结合非常有用,比如 array_merge(...$arrays)。 #### 20. proc_open() 函数 proc_open() 现在接受数组而不是命令字符串。在这种情况下,会直接打开进程(无需通过 shell),PHP 将会负责任何必要的参数转义。 ```php <?php proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes); ``` #### 21. proc_open() 现在支持 redirect 和 null 描述符。 ```php <?php // Like 2>&1 on the shell proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes); // Like 2>/dev/null or 2>nul on the shell proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes); ``` #### 22. PHP 核心 为 array_key_exists() 函数添加了一个专门的 VM opcache 优化,如果该函数可以被静态解析,则可以提高该函数的性能。如果你在项目中使用了命名空间,可能会需要使用 \array_key_exists() 来显性的导入该函数。 # 不向后兼容的变更 #### 1. 以数组形式访问非数组 尝试以数组方式访问 null,bool, int,float 或 resource (例如 $null["key"])将会抛出 notice 通知。 #### 2. get_declared_classes() 函数 get_declared_classes() 函数将不再返回匿名的类,假如它们没有被实例化的话。 #### 3. fn 关键词 fn 成为了保留关键词。需要特别注意,它不能再做为函数名或类名使用,但是仍然可以做为方法名和常量名存在。 #### 4. 文件尾部的 <?php 标签 文件尾部的 <?php 标签(不包含空行)将会被解释成一个 PHP 头标签。 #### 5. Serialization 序列化 序列化类型 o 被移除。因为它不是由 PHP 生成的,这可能会影响到之前项目中手动生成的序列化字符串。 #### 6. fread() and fwrite() 函数 fread() 和 fwrite() 在操作失败的时候会返回 false。之前的版本中会返回空字符串或 0。EAGAIN/EWOULDBLOCK 不视为故障。 这些函数现在也会在失败时发出 NOTICE 通知,例如当试图写入一个只读文件资源时。 #### 7.CURL 现在尝试序列化 CURLFile 类将会生成异常。之前仅会在反序列化时引发。 弃用 CURLPIPE_HTTP1,并在 cURL 7.62.0 起不再支持。 弃用 curl_version() 的 $version 参数。如果传递了任何不等于默认 CURLVERSION_NOW 的值,则会引发警告并忽略参数 # PHP 7.4.x 废弃的功能 #### 1. 没有显式括号的嵌套三元运算符 嵌套的三元操作中,必须明确使用显式括号来决定操作的顺序。以前,如果不使用括号,在大多数情况下,左关联性不会导致预期的行为。 <?php 1 2 : 3 4 : 5; // 弃用 (1 2 : 3) 4 : 5; // ok 1 2 : (3 4 : 5); // ok #### 2. 大括号访问数组和字符串索引 使用大括号访问数组及字符串索引的方式已被废弃。请使用 $var[$idx] 的语法来替代 $var{$idx}。 #### 3. (real) 类型和 is_real() 函数 (real) 类型已被废弃,请使用 (float) 来替代。 同时被废弃的还有 is_real() 函数,请使用 is_float() 来替代。 #### 4. parent 关键词在没父类的类中使用 在没有父类的类中使用 parent 关键词已被废弃,并且在将来的 PHP 版本中将会抛出一个编译错误。目前只在运行时访问父类时才会产生错误。 #### 5. 基础转换函数中的无效字符处理 在下面这些基础转换函数中,base_convert(), bindec(), octdec() 和 hexdec() 如果传入了非法字符,将会抛出一个弃用通知。函数会忽略掉无效字符后正常返回结果。前导空格和尾部空格,以及类型为 0x (取决于基数) 被允许传入。 #### 6. 在对象中使用 array_key_exists() 在一个对象中使用 array_key_exists() 已被废弃。请使用 isset() 或 property_exists() 来替代。 #### 8. 魔术引号函数 魔术引号函数 get_magic_quotes_gpc() 和 get_magic_quotes_runtime() 已被废弃。它们将永远返回 false。
顶部
收展
底部
[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算法