PHP 7.4
新特性
- 类属性支持添加类型
<?php
class User
{
public int $id;
public string $name;
}
$user = new User();
$user->id = '18';
$user->name = 1234;
// int(18)
var_dump($user->id);
// string(4) "1234"
var_dump($user->name);
- 箭头函数
更简洁的一种 匿名函数,比较适用于仅在一处使用到
<?php
$y = 1;
$func = fn($x) => $x + $y;
// int(2)
var_dump($func(1));
$func2 = function($x) use ($y) {
return $x + $y;
};
// int(2)
var_dump($func2(1));
- 空合并运算符赋值
<?php
$array['name'] = 'jason';
$array['age'] ??= 18;
// {"name":"jason","age":18}
echo json_encode($array);
- 数据展开操作
<?php
$part = [10, 20, 30];
$array = [1, 2, 3, ...$part, 4, 5, 6];
// [1,2,3,10,20,30,4,5,6]
echo json_encode($array);
- 数值文字分割符
<?php
// 可以让读者更直观的一眼到出数值是多少
// 4287826
echo 428_7826;
限制:
_
前后都必须是数字,形如:123_.12,12._01 都会抛出错误
新增函数
password_algos():array
返回可用的密码哈希算法ID列表
不向后兼容的变更
- fn 关键词
fn 成为了保留关键词。需要特别注意,它不能再做为函数名或类名使用,但是仍然可以做为方法名和常量名存在。
- Serialization 序列化
序列化类型 o 被移除。因为它不是由 PHP 生成的,这可能会影响到之前项目中手动生成的序列化字符串。
- fread() and fwrite() 函数
fread() 和 fwrite() 在操作失败的时候会返回 FALSE。之前的版本中会返回空字符串或 0。
- 接收到的 Cookies
从 PHP 7.4.11 开始,为了安全考虑,接受到的 Cookie 中的 names 参数不再被 URL 编码。
废弃的功能
- 没有显式括号的嵌套三元运算符
<?php
1 ? 2 : 3 ? 4 : 5; // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok
- 大括号访问数组和字符串索引
使用大括号访问数组及字符串索引的方式已被废弃。请使用 \(var[\)idx] 的语法来替代 \(var{\)idx}。
- (real) 类型和 is_real() 函数
(real) 类型已被废弃,请使用 (float) 来替代。
同时被废弃的还有 is_real() 函数,请使用 is_float() 来替代。
- parent 关键词在没父类的类中使用
在没有父类的类中使用 parent 关键词已被废弃,并且在将来的 PHP 版本中将会抛出一个编译错误。目前只在运行时访问父类时才会产生错误。
<?php
class User {
public function getName() {
parent::getName(); // 编译错误
// ...
}
}
- allow_url_include INI 选项
配置文件中的 allow_url_include 选项被废弃。如果启用了该选项,将会产生一个弃用通知。
- 在对象中使用 array_key_exists()
在一个对象中使用 array_key_exists() 已被废弃。请使用 isset() 或 property_exists() 来替代。
-
hebrevc() 函数
hebrevc() 函数已被废弃。 可以用 nl2br(hebrev($str)) 来替代,更好的方法是启用 Unicode RTL 来支持。 -
convert_cyr_string() 函数
convert_cyr_string() 函数已被废弃。可以用 mb_convert_string(), iconv() 或 UConverter 替代。 -
money_format() 函数
money_format() 函数已被废弃。 可以用更国际化的 NumberFormatter 功能来替代。
- implode 函数的参数顺序
implode() 允许反转参数顺序的特性已被废弃,请使用 implode(\(glue, \)parts) 来替代 implode(\(parts, \)glue)。