PHP 8.4 がついに登場し、開発者の作業方法を変革するエキサイティングな変更をもたらします。新しいバージョンが登場するたびに、PHP が今日の Web 開発環境において不可欠なツールであることが証明され続けています。
この記事は、PHP プログラミング言語の基本的な知識があることを前提としています。
Laravel Herd: PHP バージョンと Nginx サーバーの管理に使用されます。
PHPStorm: 優れた IntelliSense と AI コパイロットを備えた優れた IDE。
Laragon: PHP およびその他のテクノロジをサポートする使いやすいローカル開発環境。
PHP では、オブジェクト プロパティの可視性は伝統的に対称的でした。これは、プロパティの get 操作と set 操作は同じ可視性 (パブリック、プライベート、保護) を共有する必要がありますが、異なるものにすることはできないことを意味します。
たとえば、プロパティがパブリックの場合、そのプロパティへの読み取りと書き込みの両方がパブリックであり、一方の操作を許可せずに他方の操作を許可する方法はありません。
コンテキスト内で、クラスのプロパティを public に宣言すると、そのプロパティは変更可能になり、クラスの外部から読み取ったり変更したりできるようになります。
ただし、非対称可視性の出現により、プロパティの読み取りと書き込みに個別のスコープを定義できるようになりました。
これは、プロパティがあるコンテキストでは読み取り可能であり、別のコンテキストでは書き込み可能であることを意味し、プロパティへのアクセスと変更の方法をより詳細に制御できるようになります。
class Animal{ public private(set) string $name; public setName(string $foo){ $ths->name = $foo; } } $animal = new Animal(); echo $animal->name; // This will run correctly
プロパティを公開し、設定されたプロパティを非公開にすることができます。これは、プロパティをクラス外で更新できないため、不変になることを意味します。
$name プロパティを変更しようとすると、可視性スコープのためプロパティを変更できないことを示すエラーが表示されます。
非対称可視性について注意すべきいくつかの重要なポイントを次に示します。
set-visibility 宣言ではスペースを使用できません。 private(set) が正しいです。 private( set ) は正しくないため、解析エラーが発生します。
プロパティがパブリックとして宣言されている場合、メインの可視性を省略できます。たとえば、public private(set) と private(set) は、public 可視性が暗黙的に示されているため、同じように動作します。
集合演算に対して個別の可視性を持つことができるのは、型指定されたプロパティのみです。これは、PHP では型なしプロパティに非対称の可視性を適用できないことを意味します。
設定された可視性は、取得された可視性と同じか、それよりも制限的である必要があります。たとえば、public protected(set) と protected protected(set) は有効ですが、protected public(set) は構文エラーになります。
他の例も含め、非対称の可視性について詳しく調べてください。
プロパティ フックは PHP 8.4 の優れた機能であり、開発者が変数の読み取りと書き込みを行うメソッドを明示的に作成せずに、get ディレクティブと set ディレクティブを変数に直接追加する方法を導入します。
代わりに、__get および __set マジック メソッドを使用することもできますが、コードがより冗長になり、エラーが発生し、静的分析ツールが機能しなくなる可能性があります。
プロパティ フックの設計と構文は Kotlin のものに似ていると言っても過言ではありませんが、主に C# および Swift プログラミング言語の影響を受けています。
PHP 8.3 では、コンストラクターにプロパティを含むクラスを作成でき、プロパティの読み取りと書き込みが可能になります。
class Animal{ public private(set) string $name; public setName(string $foo){ $ths->name = $foo; } } $animal = new Animal(); echo $animal->name; // This will run correctly
このアプローチの問題は、プロパティに書き込むと決めたときに、__set マジック メソッドを使用するか、変数を変更するメソッドを明示的に作成することになり、結果的にコードベースが中断される可能性があることです。
プロパティ フックを使用すると、開発者はプロパティを作成した後、すぐに set ディレクティブを作成できます。
class Car { public function __construct(public string $model) { } }
set ディレクティブに渡される値はプロパティと同じ型でなければならないことに注意してください。そうでない場合はエラーがスローされます。
次に示すように、別の型を set ディレクティブに渡し、プロパティに書き込む前に正しい型に変換できます。
class Car{ public string $model{ set (string $value) { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } } }
上記の例は、set ディレクティブから複合型変数を安全に受け取り、それをプロパティで定義された正しい型に解析する方法を示しています。
set ディレクティブに渡す引数がプロパティの型と同じ場合は省略できます。たとえば、以下の 2 つのメソッドは有効であり、同様に動作します。
class Car{ public string $year{ set (string|number $value) { $year = intval($value); if($year < 2000){ throw new ValueError("We only accept cars produced in year 2000 and above"); } $this->year= $value; } } }
引数を省略した場合、デフォルトで $value が使用されることに注意してください。この構文は、Kotlin や C# などのプログラミング言語で一般的です。
この機能が登場する前は、PHP でクラスのメンバーにアクセスするには、クラスの周囲にかっこを追加する必要がありました。
// --------------------------METHOD 1---------------------------- public string $model{ set (string $value) { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } } // --------------------------METHOD 2---------------------------- public string $model{ set { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } }
新しい Car() 呼び出しをかっこで囲まないと、解析エラーが発生します。
新しい構文を使用すると、追加のかっこを必要とせずにメソッド、プロパティ、定数にアクセスできます。
class Car { public function getName(){ return "Toyota Camry"; } } $carName = (new Car())->getName();
この提案された変更の詳細については、RFC の詳細を確認してください。
新しいヘルパー関数が PHP 8.4 に追加されます。
これらの関数の一部は、すでに Laravel Arr または Collection ヘルパーに実装されています。
array_find_key() 関数
array_find_key($array, $callback) 関数は、$callback メソッドが true を返す最初の要素のキーを返します。条件を満たす要素がない場合、関数は null を返します。
class Animal{ public private(set) string $name; public setName(string $foo){ $ths->name = $foo; } } $animal = new Animal(); echo $animal->name; // This will run correctly
array_find() 関数
array_find_key() 関数は、配列を検索し、コールバック関数で定義された条件を満たす最初の要素のキーを返すように設計されています。
array_find_key() と同様に、一致する要素が見つからない場合は null を返します。
class Car { public function __construct(public string $model) { } }
配列内の果物の数量が 10 を超えない場合、関数は null を返します。
array_any() 関数
array_any() 関数は、配列内の少なくとも 1 つの要素が、提供された評価関数で指定された特定の基準を満たすかどうかを判断します。
少なくとも 1 つの要素が条件を満たす場合、関数は true を返します。それ以外の場合は false を返します。
class Car{ public string $model{ set (string $value) { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } } }
配列内に 10 より大きい数値がない場合、関数は false を返します。
array_all() 関数
array_all() 関数は、配列内のすべての項目が特定のテストに合格するかどうかをチェックします。各項目に特別なルール (コールバック関数) を適用します。
すべての項目がルールに従ってテストに合格した場合、array_all() は true を返します。
class Car{ public string $year{ set (string|number $value) { $year = intval($value); if($year < 2000){ throw new ValueError("We only accept cars produced in year 2000 and above"); } $this->year= $value; } } }
この例では、array_all() 関数は $numbers 配列を反復処理し、コールバック関数を各要素に適用します。コールバックは、数値が 2 で割り切れる (つまり、偶数である) かどうかをチェックします。
配列内のすべての数値が偶数であるため、array_all() 関数は true を返し、「すべての数値は偶数です。」というメッセージが表示されます。
と表示されます。PHP 8.4 で導入された主な改善点を調べました。これらのアップデートは、強力な新機能や効率の潜在的な向上など、開発者にとって貴重な機能強化を提供します。
例や詳細な説明を含め、すべての更新をさらに詳しく調べるには、公式 PHP 8.4.0 リリース発表ページにアクセスしてください。
最新バージョンへのスムーズな移行を確実にするために、非推奨と下位互換性の変更を忘れずに確認してください。
この記事が気に入ったら、ぜひ他の人と共有してください。
ぜひご意見をお聞かせください。下にコメントを入力して会話を続けましょう。乾杯! ?
私をフォローして、PHP、Node.js、TypeScript、PHP の記事をさらにご覧ください。 Twitter や LinkedIn でも私を見つけることができます。
以上がPHP : 主な機能と改善点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。