PHP8 新特征

联合类型(Union Types)

可以声明变量可能的类型,语法糖 = 鸡肋,旧版本不声明就是。

class Number {
    private int|float $number;

    public function setNumber(int|float $number): void {
        $this->number = $number;
    }

    public function getNumber(): int|float {
        return $this->number;
    }
}

  

添加了 WeakMap

允许数组中的 key 放入对象(鸡肋),$map[$obj] = 42;。

添加了 ValueError 类。

当函数或方法接收到具有正确类型的参数(错误类型应引发 ValueError 。

类的变更、使用

1、可变参数继承(鸡肋),允许

class A {
    public function method(int $many, string $parameters, $here) {}
}
class B extends A {
    public function method(...$everything) {}
}

  

2、后期静态绑定(LSB)(有用),对框架级别的封装、一些工厂设计模式有用。RFC

 class Test {
     public function create(): static {
           return new static();
      }
 }

  

3、现在可以使用以下方法获取对象的类名称 RFC

$object::class. 等价 get_class($object).

4、现在,new 和 instanceof 可以与任意表达式一起使用,使用

new(expression)(... $args) 和 $obj instanceof(expression)。RFC

5、现在允许写。RFC

 

Foo::BAR::$baz

6、添加 Stringable 接口(作用一般,用在视图模板封装)。RFC

只要类实现了__toString,那么这类自动实现了 Stringable 接口。

class Foo
{
    public function __toString(): string
    {
        return 'foo';
    }
}
function bar(Stringable $stringable) { /* 虽然Foo没有实现Stringable,但是这里正常的。 */ }
bar(new Foo());
bar('abc');

  

7、trait 现在可以定义抽象的私有方法。

 

现在可以将 throw 用作表达式。

原来的 throw 是语句,必须用例如 if 判断后独立抛出。(用处多)

// $value is non-nullable.
$value = $nullableValue ?? throw new InvalidArgumentException();
允许在参数列表中使用逗号结尾

  

鸡肋中的鸡肋,无用处

class Uri {
    private function __construct(
        ?string $scheme,
        ?string $user,
        ?string $pass,
        ?string $host,
        ?int $port,
        string $path,
        ?string $query,
        ?string $fragment // <-- ARGH!
    ) {
        ...
    }

  

}

现在可以编写 catch(Exception)来捕获异常而不将其存储在变量中。RFC

如果用不到异常信息可以不设变变量,减少内存?

try {
    changeImportantData();
} catch (PermissionException) {
    echo "You don't have permission to do this";
}

  

增加了对混合类型 Mixed 的支持

这个 RFC 内容挺多的,建议进去看示例。

class A
{
    public function foo(int $value) {}
}

class B extends A
{
    // Parameter type was widened from int to mixed, this is allowed
    public function foo(mixed $value) {}
}

  

增加了对注解 Annotations 的支持 RFC

这个功能应该期待很久了,多数用在配置,路由、事件、ORM 映射定义等等;很有用。

class Foo
{
    <<ORM\Column(ORM\Column::T_INTEGER)>>
    protected $height;

    <<ExampleAttribute>>
    public function foo(<<ExampleAttribute>> $bar) { }
}

  

添加了对构造函数属性提升的支持(在构造函数签名)。 RFC

语法糖,减少 Getters and Setters 代码,说实话,这部分代码还不如和 ide 开发商交涉,支持和 java 一样快捷生成更好,还减少学习成本。有用处,但不重要,鸡肋到普通之间。

// From:
class Test {
    public function __construct(public Type $prop = DEFAULT) {}
}

// 等价于:
class Test {
    public Type $prop;

    public function __construct(Type $prop = DEFAULT) {
        $this->prop = $prop;
    }
}

  

即时(JIT)编译器,属于性能改进。

PHP7 就有了,但是没有正式启用和发布。PHP8 的 JIT 是一个比较重要的功能

大数据 & 密集计算,php 没有生态,而且因为 php 不支持线程,是多进程模型并发的(在利用多核 cpu 时,无法共享对象 + 语柄资源),本身就不适合密集计算。

 

更多PHP内容请访问:

 

相关推荐:

PHP 8有哪些新增的特性?

新的PHP主要版本PHP8预计将于2020年底发布。它现在正处于非常活跃的开发中,所以在接下来的几个月里,开发速度和开发进程可能会有很大的变化。在这篇文章中,我会罗列出PHP8中会发生的一些改变:新功能、性能改进和突破性变化。因为PHP8是一个新的主要版本,所以代码及语法向下兼容性会更低。如果您一直...

PHP8中Attributes的介绍

这篇文章将为大家带来有关PHP8中Attributes的介绍,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。说注解之前,先说说以前的注释,我们经常会在PHP的项目中,看到的一个东西,类似如下的@param和@see:/** *@paramFoo$argument *...

JDK 7 新特性小结实例代码解析

1、switch支持String做参数 /*** *switch支持字符串做参数jdk7 *@authorhuangjiawei */ publicclassSwitchTest{ publicstaticvoidswitchTest(Stringarg){ switch(arg){ case"Li...

PHP 8有什么新特性

这篇文章主要讲解了“PHP8有什么新特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP8有什么新特性”吧!PHP8新特性新的主要PHP版本PHP8预计将于2020年底发布。它现在处于非常活跃的开发阶段,所以在接下来的几个月里,事情可能会发生很大...

聊聊 PHP 8 新特性 Attributes

PHP8的Alpha版本,过几天就要发布了,其中包含了不少的新特性,当然我自己认为最重要的还是JIT,这个我从2013年开始参与,中间挫折无数,失败无数后,终于要发布的东东。 不过,今天呢,我不打算谈JIT,等PHP8发布了以后,我再单独写个类似《深入理解PHP8之JIT》系列来说吧。 嘿嘿,今天呢...

PHP8中的JIT是什么

PHP8中的JIT是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JIT是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行。在PHP中,这意味着JIT将为ZendVM生...

PHP8中JIT的作用

本篇文章给大家分享的是有关PHP8中JIT的作用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP8的JITPHP实现了一个虚拟机ZendVM,它会将人类可读脚本编译成虚拟机理解的指令,也就是操作码,这个执行阶段就是“编译时(Comp...

2023,正式进入 PHP8 普及元年!

2023年即将到来:PHP现在还值得学习吗?网上不是有人说,PHP没落了吗?甚至有人说PHP已经被淘汰了?那真实情况如何呢?刚好PHP8.2.0发布不久,另外22期PHP线上班也要开课了借这个时间点,回答下同学们比较关心的几个问题。一:PHP到底能干什么?PHP是公认的Web开发首选语言,开发效率极...