PHP 8 的新特性(续)

新增 fdiv() 函数 prphp

新的 fdiv() 函数的做用相似于 fmod()intdiv() 函数,它们能够除以 0。视状况而定,将获得 INF-INFNANlaravel

新增 get_debug_type() 函数 rfcgit

get_debug_type() 返回变量的类型,听起来好像跟 gettype() 的做用同样啊?get_debug_type() 能够为数组,字符串,匿名类和对象返回更有用的输出信息。github

例如,在类\ Foo \ Bar上调用 gettype() 将返回 object,而使用 get_debug_type() 将返回类名。sql

以下表:shell

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_NOTICEE_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+「平台」

在这里插入图片描述

在这里插入图片描述


更多学习内容能够访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容但愿帮助到你们,不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们,须要的能够加入个人 PHP技术交流群

相关文章
相关标签/搜索