1. 猴子技术宅首页
  2. php干货教程

PHP8 新特征分享


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

class Number {     private int|float $number;      public function setNumber(int|float $number): void {         $this->number = $number;     }      public function getNumber(): int|float {         return $this->number;     } } 

  

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

当函数或方法接收到具有正确类型的参数(错误类型应引发 TypeError 但值不合适时,将引发 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 是语句,必须用例如 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!     ) {         ...     } 

  

}

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

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

  

这个 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) {} } 

  

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

class Foo {     <<ORMColumn(ORMColumn::T_INTEGER)>>     protected $height;      <<ExampleAttribute>>     public function foo(<<ExampleAttribute>> $bar) { } } 

  

语法糖,减少 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;     } } 

  

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

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

 

更多PHP内容请访问:

腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注