PHP は、Web 開発目的で多くのユーザーが使用するスクリプト言語です。 PHP の最新の安定した更新バージョン 8.3 は、2023 年 11 月 23 日にリリースされました。 2000 年にリリースされた PHP 3.x 以来、多くの革新と変更が行われてきました。PHP は、依然として非常に多くのユーザーに使用されている最も人気のある Web 開発 (Web デザイン) 言語の 1 つです。この記事では、コード例を使用して、PHP 8.3 の革新と変更を調べて分析します。

PHP 8.3 の主な新機能と改善点

PHP 8.3 には、以前の PHP バージョンである PHP 8.2 と比較して、多くの大きな革新と改善が加えられています。同時に、いくつかの機能が廃止されました。ここでは、コード例を使用して革新と改善を 1 つずつ検証していきます。

型付きクラス定数

型の宣言は、Web 開発の安定性を高め、エラー率を減らす、開発者にとって非常に重要な機能です。クラス内のプロパティの型宣言機能は、PHP 7.4 で追加されました。後のバージョンではこの機能に多くの改善が加えられましたが、この機能はクラス内の定数ではまだ利用できませんでした。 PHP 8.3 では、クラス内の定数の型を宣言できるようになりました。

// Doğru kullanım:
class MyClass {
    // Bildirilen tür ve değer aynı
    const string VERSION = "PHP 8.3"; // değer string
}

// Hatalı kullanım:
class MyClass {
    // Bildirilen tür ile değer farklı
    const int VERSION = "PHP 8.3"; // değer string
}

// Hatalı kullanım:
class MyClass {
    // Bildirilen tür sınıf sabitleri için desteklenmiyor
    const void VERSION = "PHP 8.3"; // değer string
}

一部の型宣言はクラス定数ではサポートされていません。

クラス定数のサポートされていない型宣言: void, callable, never

新しい関数: json_validate()

JSON 形式のデータ (json エンコードされたデータ) を扱う場合、データを使用する前に受信データが有効であることを確認する必要があります。 PHP 8.3 より前のバージョンでは、次の方法または同様の方法を使用してこれを行っていました。

// PHP 8.3'ten önceki sürümlerde JSON verisini doğrulama

$data = $json_decode($maybeJSON);

if (json_last_error() === JSON_ERROR_NONE) {
    // $data ile gerçekleştirilecek işlemler
}

この古い例では、JSON データを検証するときに、データのサイズに応じて PHP が大量のメモリを消費する可能性があります。 PHP 8.3 では、パフォーマンス指向の高速ソリューションを作成する新しい PHP 関数 json_validate() が追加されました。以下に本機能の利用シーンを例示します。

// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);

if (json_validate($maybeJSON)) {
    // $data ile gerçekleştirilecek işlemler
}

新機能: #[オーバーライド]

PHP でインターフェイスを実装する場合、インターフェイス内のメソッドに詳細な機能が提供されます。クラスのインスタンスを作成するとき、同じ名前と互換性のあるシグネチャを持つ代替バージョンを作成することで、親メソッドをオーバーライドできます。これにより、ソフトウェアに重大な問題が発生する可能性があります。つまり、問題は、小さなタイプミスの見落としの結果、main メソッドをオーバーライドしたと考えられてしまうことです。

PHP 8.3 #[Override] 機能は、この問題の解決策を提供します。これを例で見てみましょう。

class A {
    protected function myOverrideFunc(): void {}

// Doğru kullanım
// Bu örnek çalışacak
// Üstteki sınıfta ilgili method var ve geçersiz kılındı
class B extends A {
    #[\Override]
    public function myOverrideFunc(): void {}

// Hatalı kullanım
// Bu örnek çalışmayacak, çünkü ana sınıfta method yok
// Muhtemelen gözden kaçan bir yazım hatası
class C extends A {
    #[\Override]
    public function myOverrideFunction(): void {}
}

読み取り専用プロパティのディープ クローン作成

PHP では、PHP 8.1 で個々のクラス プロパティを読み取り専用として宣言し、PHP 8.2 でそれらをクラス全体に割り当てる機能が導入されました。しかし、ほとんどの Web 開発者は、そのような機能を含むクラスを操作するときに課せられる制限により、プログラミング ロジックの実用性が妨げられると考えていました。

これを変更するには RFC 主に次の 2 つの推奨事項が行われました。

読み取り専用

  1. readonly 拡張が許可されていないクラスを許可する
  2. readonly クローン作成中に機能を再起動できるようにする

2 番目の提案は PHP 8.3 に含まれていました。この新しいアプローチは PHP 8.3 に追加されました readonly プロパティを持つクラスのインスタンスreadonly プロパティ) __clone 魔法の方法で再起動できるようになります。

RFC のコード例は、この新しいメソッドがどのように機能するかを理解するのに役立ちます。

クラス定数と列挙型メンバーの動的フェッチ

PHP の他の機能とは異なり、クラス定数と列挙型メンバーを変数名でキャプチャすることは少し複雑です。 PHP 8.3 より前では、次の例のようにこれを行うことができました。

class Foo {
    public function __construct(
        public readonly DateTime $bar,
        public readonly DateTime $baz
    ) {}

    public function __clone() {
        // Klon çağrıldığında $bar yeni bir DateTime alacak
        $this->bar = clone $this->bar;

        // Ardından bu metod çağrılacak
        $this->cloneBaz();
    }

    private function cloneBaz() {
       // Bu __clone içinden çağrıldığından dolayı doğru bir kullanımdır
        unset($this->baz);
    }
}

$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;
class MyClass {
    public const THE_CONST = 9;
}

enum MyEnum: int {
    case FirstMember = 9;
    case SecondMember = 10;
}

$constantName = 'THE_CONST';
$memberName = 'FirstMember';

echo constant('MyClass::' . $constantName);
echo constant('MyEnum::' . #memberName)->value;

ここで、PHP 8.3 の上記の例のクラス定義と列挙型定義を使用して値を取得しましょう。

$constantName = 'THE_CONST';
$memberName = 'FirstNumber';

echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;

新しいメソッド: getBytesFromString()

この方法は、PHP 8.3 で追加された機能の中で最も予想外であったと言えます: 事前に承認された文字のコレクションを使用したランダム テキストの生成。

この新しい方法は非常にシンプルかつ明確です。いくつかの文字をリソースとしてメソッドに与え、使用する文字の数を指定します。それだけです!これで、メソッドは指定された長さに達するまでランダムな文字を含む結果を返します。例を挙げてこれを明確にしましょう

$generateRandomString = new Random\Randomizer();
$allowedChars = 'ABCDEFGHJKMNPQRSTVWXYZ';

$generateRandomString->getBytesFromString($allowedChars, 6) // "MBDSFD" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 6) // "DJSDKA" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 4) // "SDLA" - rastgele gelen veri

出力は、指定した文字の合計長よりも長くなる可能性があります。以下の例ではこれを実行しました。

$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';

$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veri

パラメータとして指定したすべての文字が異なる場合、どの文字が選択される確率は等しくなります。ただし、サポートされている文字リストに同じ文字を複数追加することで、出力に同じ文字をさらに表示させることができます。これを次の例で示しました。

$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';

$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veri

新しいメソッド: getFloat() および nextFloat()

このイノベーションでは、PHP 8.3 では、PHP のランダム拡張を拡張する 2 つの新しいメソッド getFloat() と nextFloat() を導入しています。

これらの方法の例:

$generateRandomNumber = new Random\Randomizer();

// Rastgele ondalıklı (float) bir rakam oluştur
// Değer 0 ile 5 arasında olsun
$generateRandomNumber->getFloat(0,5); // 2.483929 - rastgele gelen veri

// 0 ile 1 arasında rastgele ondalıklı bir rakam oluştur
$generateRandomNumber->nextFloat(); // 0.4828258 rastgele gelen veri

PHP 8.3 のマイナーな革新と改善

上記の革新に加えて、PHP 8.3 には他にも多数の小規模な改善と革新があります。以下のリストに、それらをソース文書とともにリストしました。

PHP 8.3 で非推奨になりました

PHP の新しいバージョンごとに、一部のコードが非推奨としてマークされます。これらの機能が完全に非推奨になった後は、使用することは決して推奨されません。非推奨のコードが使用されている場合、コードの実行時にエラー メッセージが返されます。

PHP 8.3 での非推奨のリスト:

PHP8.3

この記事では、PHP 8.3 の重要な変更点と革新性をレビューしました。 PHP 8.3 のすべての変更点の詳細なリストについては、 公式変更履歴 見直してみることをお勧めします。コードまたはサイトを PHP 8.2 から PHP 8.3 にアップグレードする場合は、このガイドが役立つ可能性があります: PHP 8.3 移行ガイド -> https://www.php.net/manual/en/migration83.php

PHP のバージョンと移行について心配な場合は、新しいバージョンを PHP 8.3 にアップグレードするまで時間を置くことをお勧めします。

PHP および JavaScript 言語と関連テクノロジーを Onur Özden Web Çözümleri として完全にカバー ウェブソフトウェア サービスを提供しております。  ご質問やご要望がある場合は、左下の Whatsapp ボタンからすぐにお問い合わせいただき、見積もりを入手してください。