新增 fdiv()
函数 pr
新的 fdiv()
函数的作用类似于fmod()
和 intdiv()
函数,它们可以除以 0。视情况而定,将得到 INF
,-INF
或 NAN
。
新增 get_debug_type()
函数 rfc
get_debug_type()
返回变量的类型,听起来好像跟 gettype()
的作用一样啊?get_debug_type()
可以为数组,字符串,匿名类和对象返回更有用的输出信息。
例如,在类\ Foo \ Bar
上调用 gettype()
将返回 object
,而使用 get_debug_type()
将返回类名。
如下表:
Value | get_debug_type() | gettype() |
---|---|---|
0 | int | integer |
0.1 | float | double |
true | bool | boolean |
false | bool | boolean |
“hello” | string | |
[] | array | |
null | null | NULL |
A class with name “Foo\Bar” | Foo\Bar | object |
An anonymous class | class@anonymous | object |
A resource | resource (xxx) | resource |
A closed resource | resource (closed) |
可以在 RFC 中找到 get_debug_type()
和 gettype()
之间的差异的完整列表。
新增 get_resource_id()
函数 pr
资源是 PHP 中的特殊变量,指的是外部资源。一个示例是 MySQL 连接,另一个是文件句柄。
这些资源中的每一个都分配有一个 ID,然而在这之前,如果想获取某资源的 ID,唯一方法是将资源转换为 int:
$resourceId = (int) $resource;
PHP 8 添加了 get_resource_id() 函数,使此操作更加明显且类型安全:
$resourceId = get_resource_id($resource);
Traits 改进中的抽象方法 rfc
Traits 可以指定必须由使用它们的类所实现的抽象方法。需要注意的是: 在 PHP 8 之前,尚未验证这些方法已经实现的标识。以下内容有效:
trait Test {
abstract public function test(int $input): int;
}
class UsesTrait
{
use Test;
public function test($input)
{
return $input;
}
}
当使用 Traits 并实现其抽象方法时,PHP 8 将执行适当的方法进行标识验证抽象方法是否确实被实现。这意味着您需要编写以下代码:
class UsesTrait
{
use Test;
public function test(int $input): int
{
return $input;
}
}
token_get_all()
rfc 的对象实现
token_get_all()
函数返回一个值数组,该 RFC 使用 PhpToken :: getAll()
方法新增了 PhpToken
类。此实现适用于对象而不是普通值。它消耗更少的内存,并且更易于阅读。
可变语法调整
在 RFC 中:“统一变量语法 RFC 解决了 PHP 变量语法中的许多不一致之处。该 RFC 旨在解决一小部分被忽略的情况。”
内部函数的类型注解
许多人 投入 了为所有内部函数添加适当的类型注释的工作。这是一个长期存在的问题,最终可以通过以前版本中对 PHP 所做的所有更改来解决。这意味着内部函数和方法将在反射中具有完整的类型信息。
重大变化
如前所述:这是一个重大更新,因此会有重大变化。最好的办法是查看 升级 文档中所列的重大变化的完整列表。
许多这些突破性的更改在以前的 7.* 版本中已被弃用,因此如果你多年来一直保持 PHP 在最新状态,升级到 PHP 8 应该没那么难。
一致的类型错误
之前版本在出现类型错误时,PHP 中的用户定义函数已经会抛出 TypeErrors
,但是内部函数不会这么做,而是发出警告并返回 null
。从 PHP 8 开始,内部函数的行为已变得和用户定义函数一致。
重新分类的引擎警告
许多以前仅触发警告或通知的错误已转换为适当的错误。以下警告已更改。
-
变量未定义:
Error
异常代替通知 -
数组索引未定义:警告代替通知
-
除以零:
DivisionByZeroError
异常代替警告 -
尝试添加 / 移除非对象的属性 ‘% s’ :
Error
异常代替警告 -
尝试修改非对象的属性 ‘% s’ :
Error
异常代替警告 -
尝试分配非对象的属性 ‘% s’ :
Error
异常代替警告 -
从空值创建默认对象:
Error
异常代替警告 -
尝试获取非对象的属性 ‘% s’ :警告代替通知
-
未定义的属性:% s:😒% s:警告代替通知
-
无法添加元素到数组,因为下一个元素已被占用:
Error
异常代替警告 -
无法在非数组变量中销毁偏移量:
Error
异常代替警告 -
无法将标量值用作数组:
Error
异常代替警告 -
只有数组和
Traversables
可以被解包:TypeError
异常代替警告 -
为 foreach () 提供了无效的参数:
TypeError
异常代替警告 -
偏移量类型非法:
TypeError
异常代替警告 -
isset 或 empty 中的偏移量类型非法:
TypeError
异常代替警告 -
unset 中的偏移量类型非法:
TypeError
异常代替警告 -
数组到字符串的转换:警告代替通知
-
资源 ID#% d 用作偏移量,转换为整数 (% d):警告代替通知
-
发生字符串偏移量转换:警告代替通知
-
未初始化的字符串偏移量:% d:警告代替通知
-
无法将空字符串分配给字符串偏移量:
Error
异常代替警告 -
提供的资源不是有效的流资源:
TypeError
异常代替警告
@ 运算符不再使致命错误不提醒
此更改可能会使 PHP 8 之前的版本被 @ 隐藏的错误再次显示出来。请确保在生产服务器上设置了 display_errors=Off
!
默认错误报告级别
现在的默认错误报告级别是 E_ALL
而不是之前的除 E_NOTICE
和 E_DEPRECATED
的所有内容。这意味着可能会弹出许多错误,这些错误以前曾被忽略,尽管在 PHP 8 之前的版本中可能已经存在。
默认 PDO 错误模式
根据 RFC:当前 PDO 的默认错误模式为静默。这意味着当出现 SQL 错误时,除非开发人员实现了自己的显式错误处理,否则不会发出任何错误或警告,也不会引发任何异常。
此 RFC 将在 PHP 8 中将默认 PDO 错误模式 改为 PDO::ERRMODE_EXCEPTION
。
串联优先级
在 PHP 7.4 中已废弃的同时,此变更开始生效。如果你像这样子书写:
echo "sum: " . $a + $b;
PHP 以前会如是理解:
echo ("sum: " . $a) + $b;
PHP 8 将这么做故理解为此:
echo "sum: " . ($a + $b);
更严格的算术和位运算类型检查 rfc
PHP 8 以前,算术或位运算符用于数组、资源或对象是可接受的。现在不再可接受,并会抛出一个 类型错误 :
[] % [42];
$object + 4;
反射方法签名变更
反射类的 3 个方法签名已变更:
ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);
现在已变成:
ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);
升级指南指定,如果要扩展这些类,并且仍想同时支持 PHP 7 和 PHP 8,则允许以下签名:
ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);
点关注,不迷路
好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以
更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群