ホームページ 見出し PHP 8 のすべての新機能の概要とコード例

PHP 8 のすべての新機能の概要とコード例

Oct 30, 2020 pm 02:39 PM
php8

PHP 8 のすべての新機能とコード例の概要

PHP 8 の正式バージョンは間もなくリリースされます。RC3 は 10 月 29 日にリリースされ、RC4 は 10 月 29 日にリリースされます。 RC4 は 11 月 12 日にリリースされ、RC4 は 11 月 26 日にリリースされます。正式バージョンは同日にリリースされます (PHP 8 リリース スケジュール をクリックして表示できます)。

それでは、PHP 8 に追加される新機能を見てみましょう。この記事では、PHP 8 のすべての新機能と、対応するコード例を示します。

PHP 8 のコンパイルとインストール

サンプル コードの実行を容易にするために、開始する前に PHP 8 RC2 バージョンをローカルにコンパイルしてインストールできます:

// 0、下载解压源码
wget https://downloads.php.net/~pollita/php-8.0.0RC2.tar.gz
tar zxvf php-8.0.0RC2.tar.gz
cd php-8.0.0RC2

// 1、生成 configure 文件
./buildconf --force

// 2、配置构建流程(最小化安装)
./configure --prefix=/usr/local/php8 \
--with-config-file-path=/usr/local/php8 \
--enable-cli \
--without-iconv

// 3、构建 && 安装
make && sudo make install

// 4、拷贝配置文件
sudo cp php.ini-development /usr/local/php8/php.ini
ログイン後にコピー

インストール完了後、バージョンを確認して、PHP 8 が正常にインストールされていることを確認します:

PHP 8 のすべての新機能の概要とコード例

ローカル オペレーティング システムは Mac です。Windows 環境のインストールの場合は、以前に JIT を紹介したこのチュートリアルを参照してください: WSL 仮想マシンに基づいて PHP 8 をコンパイルしてインストールします。

PHP 8 CLI インタープリターの呼び出しを容易にするために、ZSH 構成ファイル ~/.zshrc でそのエイリアスを構成しました:

alias php8="/usr/local/php8/bin/php"
ログイン後にコピー

Then runsource ~/.zshrc 上記のエイリアスを有効にします。将来的には、php8 を通じて PHP 8 CLI インタープリタを直接呼び出すことができます:

PHP 8 のすべての新機能の概要とコード例

新しいサンプル プロジェクト

次に、PhpStorm で新しい php8-demo プロジェクトを作成し、このチュートリアルのサンプル コードを保存し、以下を追加しますPHP 言語レベルとコマンドライン インタプリタはすべて PHP 8.0 に調整されているため、PhpStorm は最新バージョンの PHP をサポートします (設定方法がわかりませんか? PhpStorm チュートリアルにアクセスして読むことができます) ):

PHP 8 のすべての新機能の概要とコード例

これで、PHP 8 の新機能を探索する旅を始めることができます。

共用体型の新しいサポート

共用タイプを使用すると、変数が 1 つの型ではなく複数の型の値を持つことができます (理解しやすいように、C 言語の共用型を参照してください) )。

サンプル コードは次のように記述します:

<?php declare(strict_types=1);

/**
 * 定义一个支持联合类型的 Number 类
 */ 
class Number {
    private int|float $number;
 
    public function setNumber(int|float $number): void {
        $this->number = $number;
    }
 
    public function getNumber(): int|float {
        return $this->number;
    }
}

/**
 * 我们可以传递浮点型和整型值到 Number 对象
 */
$number = new Number();

$number->setNumber(5);

var_dump($number->getNumber());

$number->setNumber(11.54);

var_dump($number->getNumber());

exit;
ログイン後にコピー

上記のコードは次のように実行されます:

PHP 8 のすべての新機能の概要とコード例

新しい WeakMap 機能

WeakMap を使用すると、キーとして使用されるオブジェクトのガベージ コレクションを妨げることなく、オブジェクトの任意の値へのマッピング (SplObjectStorage と同様) を作成できます。オブジェクト キーがガベージ コレクションされると、対応するキーと値のペアがコレクションから削除されます。

開発者はコード内のメモリ リークを心配する必要がないため、この新機能は非常に便利です。ほとんどの PHP 開発者はおそらくこれを気にしませんが、イベント駆動型プログラミングに ReactPHP を使用する場合など、長時間実行されるプロセスを作成する場合は、この問題に注意する必要があります。WeakMap を使用すると、参照されたオブジェクトは有効期限が切れると自動的に期限切れになります。 . ガベージが収集されました。

同じことを配列で実行すると、オブジェクトへの参照が保持されたままになり、メモリ リークが発生します。

サンプル コードは次のように記述します:

<?php declare(strict_types=1);


class FooBar {
    public WeakMap $cache;

    public function __construct() {
        $this->cache = new WeakMap();
    }

    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }

    public function computeSomethingExpensive(object $obj) {
        var_dump("I got called");
        return rand(1, 100);
    }
}

$cacheObject = new stdClass;

$obj = new FooBar;
// "I got called" 只会打印一次
$obj->getSomethingWithCaching($cacheObject);
$obj->getSomethingWithCaching($cacheObject);

var_dump(count($obj->cache));

// 删除该对象后 WeakMap 会释放相应内存
unset($cacheObject);

var_dump(count($obj->cache));

exit;
ログイン後にコピー

対応する実行結果は次のとおりです:

PHP 8 のすべての新機能の概要とコード例

New ValueError 例外

PHP 8 では、Exception 基本クラスを継承する ValueError という名前の新しい組み込み例外クラスが導入されています。この例外は、無効な型の関数に値を渡すたびにスローされます。PHP 8 より前では、このような操作を行うと警告が発生しました。

以下はサンプル コードです:

<?php declare(strict_types=1);

/**
 * 传递数组到 array_rand,类型正确,但是 array_rand 期望传入的是非空数组
 * 所以会抛出 ValueError 异常
 */
array_rand([], 0);

/**
 * json_decode 的深度参数必须是有效的正整型值,
 * 所以这里也会抛出 ValueError 异常
 */
json_decode(&#39;{}&#39;, true, -1);
ログイン後にコピー

実行結果は次のとおりです:

PHP 8 のすべての新機能の概要とコード例

オーバーライド時に変数パラメーターを許可するメソッド

サブクラスで親クラスのメソッドをオーバーライドする場合、対応するパラメータの型に互換性がある限り、任意の数のパラメータを変数パラメータに置き換えることができます。実行結果は次のとおりです。

PHP 8 のすべての新機能の概要とコード例

静的な戻り値の型

PHP 8 では、

static# を使用できます。 ## 特定のメソッドを識別するためのキーワードは、メソッドが継承されている場合でも、そのメソッドが現在属しているクラスを返します (遅延静的バインディング):

<?php declare(strict_types=1);

class A {
    public function method(int $many, string $parameters, $here) {

    }
}
class B extends A {
    public function method(...$everything) {
        var_dump($everything);
    }
}

$b = new B();
$b->method('i can be overwritten!');
exit;
ログイン後にコピー
オブジェクトのクラス名リテラル

PHP 8 では、$object::class

を使用してオブジェクトのクラス名を取得できます。戻り結果は

get_class($object) と同じです。

<?php declare(strict_types=1);

class Test {
    public function doWhatever(): static {
        // Do whatever.
        return $this;
    }
}

exit;
ログイン後にコピー
実行結果は次のとおりです。

PHP 8 のすべての新機能の概要とコード例変数構文の調整

newinstanceof 关键字现在可以被用于任意表达式:

<?php declare(strict_types=1);

class Foo {}
class Bar {}

$names = [&#39;Foo&#39;, &#39;Bar&#39;];
$class = new ($names[array_rand($names)]);

var_dump($class);

exit;
ログイン後にコピー

运行结果如下:

PHP 8 のすべての新機能の概要とコード例

Stringable 接口

PHP 8 引入了新的 Stringable 接口,只要某个类实现了 __toString 方法,即被视作自动实现了 Stringable 接口(咋和 Go 接口实现有点像),而不必显式声明实现该接口:

<?php declare(strict_types=1);

class Foo {
    public function __toString() {
        return &#39;I am a class&#39;;
    }
}

$obj = new Foo;
var_dump($obj instanceof Stringable);

exit;
ログイン後にコピー

运行结果如下:

PHP 8 のすべての新機能の概要とコード例

Trait 现在可以定义抽象私有方法

<?php declare(strict_types=1);


trait MyTrait {
    abstract private function neededByTheTrait(): string;

    public function doSomething() {
        return strlen($this->neededByTheTrait());
    }
}

class TraitUser {
    use MyTrait;

    // 支持该语法
    private function neededByTheTrait(): string { }

    // 不支持该语法 (错误的返回类型)
    // private function neededByTheTrait(): stdClass { }

    // 支持该语法 (非静态方法变成了静态方法)
    // private static function neededByTheTrait(): string { }
}

exit;
ログイン後にコピー

throw 现在可以被用作表达式

throw 语句现在可以用在只允许表达式出现的地方,例如箭头函数、合并运算符和三元运算符等:

<?php declare(strict_types=1);

$callable = fn() => throw new Exception();

$nullableValue = null;

// $value 是非空的
$value = $nullableValue ?? throw new \InvalidArgumentException();


exit;
ログイン後にコピー

参数列表中允许出现可选的尾部逗号

和数组中的尾部逗号类似,现在也可以在参数列表中定义一个尾部逗号:

<?php declare(strict_types=1);

function method_with_many_arguments(
    $a,
    $b,
    $c,
    $d,
) {
    var_dump("this is valid syntax");
}

method_with_many_arguments(
    1,
    2,
    3,
    4,
);

exit;
ログイン後にコピー

上述代码运行结果是正常的:

PHP 8 のすべての新機能の概要とコード例

捕获异常而不存储到变量

现在可以编写 catch (Exception) 代码来捕获异常而不必将其存储到一个变量中:

<?php declare(strict_types=1);

$nullableValue = null;

try {
    $value = $nullableValue ?? throw new \InvalidArgumentException();
} catch (\InvalidArgumentException) {
    var_dump("Something went wrong");
}

exit;
ログイン後にコピー

上述代码运行结果如下:

PHP 8 のすべての新機能の概要とコード例

新增对 mixed 类型的支持

PHP 8 引入了新的名为 mixed 的类型,该类型等价于 array|bool|callable|int|float|null|object|resource|string

<?php declare(strict_types=1);

function debug_function(mixed ...$data)
{
    var_dump($data);
}

debug_function(1, &#39;string&#39;, []);

exit;
ログイン後にコピー

上述代码运行结果如下:

PHP 8 のすべての新機能の概要とコード例

新增对注解的支持

PHP 8 的注解实际上包含了多个 RFC:

  • https://wiki.php.net/rfc/attributes_v2
  • https://wiki.php.net/rfc/attribute_amendments
  • https://wiki.php.net/rfc/shorter_attribute_syntax
  • https://wiki.php.net/rfc/shorter_attribute_syntax_change

注解绝对是 PHP 8 引入的最大新特性之一,一开始理解起来可能有点困难(不过有 Java 基础的话会很简单)。简而言之,注解允许你添加元数据到 PHP 函数、参数、类等,这些元数据随后可以通过可编程方式获取,在 PHP 7 或者更低版本中实现类似功能需要解析代码注释块,而通过注解可以直接访问深度集成到 PHP 自身的这些信息。

我们来编写一段示例代码方便你理解,假设你想要允许开发者添加中间件到控制器类/方法,使用注解可以这么做:

<?php declare(strict_types=1);

// 首先,我们需要定义注解,注解本身只是一个原生的 PHP 类,并且自身被打上了注解的注释

#[Attribute]
class ApplyMiddleware
{
    public array $middlware = [];

    public function __construct(...$middleware)
    {
        $this->middleware = $middleware;
    }
}

// 下面的语法会添加上述注解到 MyController 类,并且传入 auth 作为参数

#[ApplyMiddleware('auth')]
class MyController
{
    public function index()
    {
    }
}

// 然后我们就可以在类中使用反射获取所有的 ApplyMiddleware 注解并读取给定的中间件参数

$reflectionClass = new ReflectionClass(MyController::class);

$attributes = $reflectionClass->getAttributes(ApplyMiddleware::class);

foreach ($attributes as $attribute) {
    $middlewareAttribute = $attribute->newInstance();
    var_dump($middlewareAttribute->middleware);
}

exit;
ログイン後にコピー

运行上述代码,打印结果如下:

PHP 8 のすべての新機能の概要とコード例

新增构造函数属性提示支持

这个新特性只是一个语法简写而言,可以将属性声明和构造函数属性初始化合并到一起:

<?php declare(strict_types=1);

class User {
    public function __construct(
        public int $id,
        public string $name,
    ) {}
}

$user = new User(1, &#39;Marcel&#39;);

var_dump($user->id);
var_dump($user->name);

exit;
ログイン後にコピー

上述代码运行结果如下:

PHP 8 のすべての新機能の概要とコード例

新增 match 表达式支持

match 表达式和 switch 分支语句类型,但是语义上更加安全并且可以直接返回值:

<?php declare(strict_types=1);

echo match (1) {
    0 => 'Foo',
    1 => 'Bar',
    2 => 'Baz',
};

exit;
ログイン後にコピー

上述代码运行结果如下:

PHP 8 のすべての新機能の概要とコード例

新增对空安全运算符 ?-> 的支持

当该运算符的左侧评估为 null 时,整个代码链路的执行将会被终止并整体评估为 null。如果不为 null 的话,则和普通的 -> 运算符功能一致:

<?php declare(strict_types=1);

class User {
    public function getAddress() {}
}

$user = new User();

$country = $user?->getAddress()?->country?->iso_code;

var_dump($country);

exit;
ログイン後にコピー

上述代码运行结果如下:

PHP 8 のすべての新機能の概要とコード例

新增对命名参数的支持

命名参数允许基于参数名称传递参数到函数,而不是参数所在的位置,这样一来,函数参数就可以自解释并且与顺序无关,并且允许跳过默认值:

<?php declare(strict_types=1);

array_fill(start_index: 0, num: 100, value: 50);

exit;
ログイン後にコピー

注:PHP 8 还有另一个重要的新特性 —— 引入对 JIT 的支持,不过对于上层业务代码而言是无感的,只是底层优化而已,想要了解 JIT 对 PHP 应用性能的影响,请参考之前发布的这篇文章:https://xueyuanjun.com/post/21702。本篇教程所有示例代码整理自 PHP 8 - try out all new features,原文基于 Laravel 框架进行测试,这里将其转化为了通用的 PHP 代码


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

php5とphp8の違いは何ですか php5とphp8の違いは何ですか Sep 25, 2023 pm 01:34 PM

php5 と php8 の違いは、パフォーマンス、言語構造、型システム、エラー処理、非同期プログラミング、標準ライブラリ関数、セキュリティの点です。詳細な紹介: 1. パフォーマンスの向上. PHP5 と比較して、PHP8 はパフォーマンスが大幅に向上しています. PHP8 では、高頻度の実行コードをコンパイルおよび最適化できる JIT コンパイラーが導入されており、それによって実行速度が向上しています; 2. 言語構造の改善、 PHP8 では、いくつかの新しい言語構造と関数が導入されており、PHP8 では名前付きパラメータがサポートされており、開発者はパラメータの順序などの代わりにパラメータ名を渡すことができます。

mysql拡張機能をphp8に追加する方法 mysql拡張機能をphp8に追加する方法 Oct 07, 2023 pm 03:31 PM

mysql 拡張機能を php8 に追加する手順は次のとおりです: 1. MySQL クライアント ライブラリをインストールします; 2. PHP 8 の開発ツールをインストールします; 3. MySQL 拡張機能のソース コードをダウンロードします; 4. MySQL 拡張機能をコンパイルしてインストールします; 5. MySQL 拡張機能; 6. Web サーバーのみを再起動します。

apache2.4+php8.0のインストールと設定方法を図解で詳しく解説 apache2.4+php8.0のインストールと設定方法を図解で詳しく解説 Dec 06, 2022 pm 04:53 PM

この記事では、apache2.4のインストール方法とphp8.0の設定方法を画像付きで詳しく紹介します。apache2.4+php8.0のインストールと設定方法を見てみましょう~

php8でデータベースに接続する方法 php8でデータベースに接続する方法 Nov 16, 2023 pm 02:41 PM

PHP8 は、mysqli と PDO を使用してデータベースに接続できます。詳細な紹介: 1. mysqli を使用して、データベース サーバー名、ユーザー名、パスワード、および接続するデータベース名を渡してデータベースに接続します。次に、`connect_error` 属性を使用して接続が成功したかどうかを確認し、接続が失敗した場合はエラー メッセージを出力します。最後に、`close()` メソッドを呼び出して接続を閉じます; 2. PDO を使用してデータベースに接続し、データベース サーバー名、パスワード、データベース名などを渡して接続します。

php8のデータ型を変換する方法 php8のデータ型を変換する方法 Nov 16, 2023 pm 02:51 PM

php8 データ型のメソッドには、文字列から整数への変換、整数から文字列への変換、文字列から浮動小数点数への変換、浮動小数点数から文字列への変換、配列から文字列への変換、文字列から配列への変換、およびブール値から整数への変換が含まれます。 . 整数からブール値への変換、変数の型の決定と変換。詳細な紹介: 1. 文字列から整数への変換には、intval() 関数と (int) 強制型変換が含まれます; 2. 整数から文字列への変換には、strval() 関数と (string) 強制型変換が含まれます; 3. 変換文字列を浮動小数点ポイントに変換するなどです。

PHP 8 の JIT の詳細 PHP 8 の JIT の詳細 Apr 25, 2022 pm 08:46 PM

この記事では、PHP 8 の JIT について説明し、JIT が解釈プロセスにどのように参加するかについて説明します。

php8 ではどのようなパフォーマンスの向上がありますか? php8 ではどのようなパフォーマンスの向上がありますか? Dec 21, 2023 pm 02:44 PM

php8 のパフォーマンス向上には、1. JIT コンパイラの導入、2. 関数呼び出しの最適化、3. ガベージ コレクション メカニズムの改善、4. 型システムの改善、5. 新しい言語機能、6. 文字列処理の最適化、7.配列処理の改善、8. 新しいメモリ管理メカニズムの導入、9. コード生成の最適化。詳細な紹介: 1. JIT コンパイラーの導入 PHP8 では、より効率的に実行するために PHP コードをマシンコードに変換できる動的コンパイル技術である JIT コンパイラーが導入されています; 2. 関数呼び出しの最適化など。

php8にはどのような機能があるのでしょうか? php8にはどのような機能があるのでしょうか? Dec 21, 2023 pm 02:54 PM

php8 の機能: 1. JIT コンパイラ; 2. 名前付きパラメータ; 3. 共用体型; 4. アノテーション; 5. コンストラクタ属性の強化; 6. 一致式; 7. nullsafe 演算子; 8. 型システムの改善; 9 、エラー処理の改善; 10. 一貫性の向上。詳細な紹介: 1. JIT コンパイラ、PHP8 は、PHP コードをネイティブ マシン コードにコンパイルするジャストインタイム コンパイル テクノロジを導入し、それによってプログラムの実行速度を向上させます; 2. 名前付きパラメータ、PHP8 は名前付きパラメータをサポートし、関数呼び出し時のパラメータ名など