PHP8 新特徵

selden發表於2020-06-28

聯合型別(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類。

當函式或方法接收到具有正確型別的引數(錯誤型別應引發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用作表示式。

原來的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的jit很尷尬;
在web場景是:大部分是IO,比如程式碼執行時間從0.10ms提升到0.03ms真的感受不到。
大資料&密集計算,php沒有生態,而且因為php不支援執行緒,是多程式模型併發的(在利用多核cpu時,無法共享物件+語柄資源),本身就不適合密集計算。

原文

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章