コンテンツにスキップ

PHP/新機能

出典: フリー教科書『ウィキブックス(Wikibooks)』
< PHP

PHP 8.3 の新機能

[編集]

PHP 8.3 は、2023年11月23日にリリースされ、言語の柔軟性や型安全性、パフォーマンスを向上させるいくつかの新機能と改良が追加されました。以下に主な新機能を説明します。

型付きクラス定数

[編集]

PHP 8.3 では、クラス定数に型を指定できるようになりました。これにより、定数の型を強制し、コードの安全性が向上します。

class MyClass {
    public const int MAX_ITEMS = 100;
}

動的なクラス定数の取得

[編集]

PHP 8.3 では、クラス定数を動的に取得できるようになりました。コンパイル時にクラス名が不明な場合でも、実行時にクラス定数を動的に取得できます。

$class = MyClass::class;
echo $class::MAX_ITEMS;

#[\Override] 属性

[編集]

新しく追加された #[\Override] 属性を使うことで、親クラスのメソッドをオーバーライドしていることを明示できます。これにより、コードの可読性が向上し、誤りを防ぐことができます。

class ParentClass {
    public function doSomething() {}
}

class ChildClass extends ParentClass {
    #[\Override]
    public function doSomething() {
        // 親クラスのメソッドをオーバーライド
    }
}

読み取り専用プロパティの深いコピー

[編集]

PHP 8.3 では、読み取り専用(readonly)プロパティを持つオブジェクトの深いコピーが可能になりました。以前はこのようなプロパティを持つオブジェクトの複製に問題がありましたが、改善され、正しく複製できるようになりました。

class MyClass {
    public readonly string $name;

    public function __construct(string $name) {
        $this->name = $name;
    }
}

$object = new MyClass('example');
$clone = clone $object; // 読み取り専用プロパティも複製可能

json_validate() 関数

[編集]

新しい json_validate() 関数が追加され、JSON 文字列をデコードせずにその妥当性を確認できるようになりました。JSON の形式が正しいかどうかを検証したい場合に便利です。

$json = '{"name": "example"}';
if (json_validate($json)) {
    echo '有効なJSONです!';
}

ランダマイザ機能の追加

[編集]

PHP 8.3 では、ランダムな数値の生成や配列のシャッフルを行う際に、従来の rand()mt_rand() よりも柔軟な方法を提供するランダマイザ機能が強化されました。

コマンドラインリンターが複数ファイルに対応

[編集]

PHP のコマンドラインリンターが複数ファイルのチェックに対応しました。これにより、ディレクトリや複数のファイルを一度にリントできるようになり、開発の効率が向上します。

php -l file1.php file2.php file3.php

PHP 8.2 の新機能

[編集]

PHP 8.2 は、2022年12月8日にリリースされ、言語機能の向上とタイプシステムの強化を目指したいくつかの重要な新機能が追加されました。以下に、PHP 8.2の主な新機能を解説します。

読み取り専用クラス(Readonly Classes)

[編集]

PHP 8.2 では、クラス全体を読み取り専用にすることができるようになりました。readonly 修飾子をクラスに付与することで、そのクラスのすべてのプロパティが自動的に読み取り専用となり、オブジェクトが初期化された後にプロパティの値が変更されることを防ぎます。

readonly class MyClass {
    public int $id;
    public string $name;

    public function __construct(int $id, string $name) {
        $this->id = $id;
        $this->name = $name;
    }
}

この機能により、データの不変性を確保しやすくなります。

nullfalsetrue を独立した型として使用(Null, False, and True as Stand-alone Types)

[編集]

PHP 8.2 では、nullfalsetrue が独立した型として宣言できるようになりました。これにより、より厳密な型指定が可能になり、特定の値を返す関数やメソッドの型安全性が向上します。

function isTrue(): true {
    return true;
}

function getValue(): null {
    return null;
}

これにより、型の精度が高まり、予期しない値の混入を防ぐことができます。

ロケール非依存のケース変換(Locale-independent Case Conversion)

[編集]

PHP 8.2 では、文字の大文字・小文字変換がロケール(地域設定)に依存しないようになりました。これにより、文字列のケース変換が一貫して行われるようになり、特定のロケール環境に依存した不具合を避けられるようになりました。

$str = "i̇stanbul"; // トルコ語の "i" の特殊ケース
echo strtoupper($str); // ロケールに依存せず変換

これにより、マルチロケール対応アプリケーションでの文字列操作がより安定します。

論理和標準形(Disjunctive Normal Form)タイプ(DNF)

[編集]

PHP 8.2 では、型宣言における「論理和標準形」(DNF)タイプをサポートしました。これにより、複雑な型の組み合わせをより明確に表現できるようになります。DNF は、型が複数の組み合わせで表現される場合に使われ、より柔軟な型システムを提供します。

function processData((A&B)|(C&D) $data) {
    // 型 A かつ B、または型 C かつ D のデータを受け取る
}

この機能により、型の組み合わせに関する処理をより明確に指定でき、コードの堅牢性が向上します。

トレイト内での定数宣言(Constants in Traits)

[編集]

PHP 8.2 では、トレイト内で定数を宣言できるようになりました。これにより、コードの再利用性が向上し、トレイト内で共通の定数を定義し、それを使用するクラスで活用することが可能になります。

trait MyTrait {
    public const TRAIT_CONSTANT = 'Trait constant value';
}

class MyClass {
    use MyTrait;
}

echo MyClass::TRAIT_CONSTANT; // 'Trait constant value'

この機能は、トレイトを使用している複数のクラスで一貫性を持たせた定数の利用が可能になります。

PHP 8.1 の新機能

[編集]

PHP 8.1 は、2021年11月25日にリリースされ、開発者にとって非常に重要な機能が追加され、より堅牢で効率的なプログラミングが可能になりました。以下に、PHP 8.1の主な新機能を解説します。

明示的な8進数リテラル表記(Explicit Octal Integer Literal Notation)

[編集]

PHP 8.1 では、8進数リテラルを明示的に表記するために、0o プレフィックスが導入されました。従来の 0 で始まる表記と区別しやすくなり、読みやすさと誤解を避けることが目的です。

$octal = 0o77; // 8進数の77(10進数では63)

列挙型(Enumerations, Enums)

[編集]

PHP 8.1 の列挙型は、事前に定義された一連の定数値を持つ型を定義できる機能です。これにより、特定の値の範囲を厳密に制限し、コードの可読性と安全性が向上します。

enum Status {
    case Pending;
    case Approved;
    case Rejected;
}

$status = Status::Approved;

列挙型は、状態やフラグなどの定義に非常に有効です。

読み取り専用プロパティ(Read-only Properties)

[編集]

PHP 8.1 では、プロパティを読み取り専用(readonly)にすることができるようになりました。これにより、オブジェクトのプロパティが初期化後に変更されることを防ぎ、データの不変性を保証します。

class User {
    public readonly string $name;

    public function __construct(string $name) {
        $this->name = $name;
    }
}

$user = new User('John');
$user->name = 'Jane'; // エラー: 読み取り専用プロパティ

ファーストクラスコール構文(First-class Callable Syntax)

[編集]

PHP 8.1 では、新しいコール構文を使用して関数やメソッドを簡単にコールバックとして渡せるようになりました。fn() のようなシンプルな構文で、関数やメソッドを扱うことができます。

$callable = strlen(...);
echo $callable('PHP'); // 出力: 3

これにより、コールバック関数の利用が簡単で読みやすくなります。

初期化子での new キーワード(New in Initializers)

[編集]

PHP 8.1 では、クラスプロパティや定数の初期化に new を使用してオブジェクトを直接生成できるようになりました。これにより、クラスのインスタンスを初期化時に簡潔に生成できます。

class MyClass {
    public const INSTANCE = new DateTime();
}

純粋交差型(Pure Intersection Types)

[編集]

PHP 8.1 では、交差型(Intersection Types)を導入し、複数のインターフェースや型の条件を同時に満たす値を指定できるようになりました。これにより、より厳密な型チェックが可能になります。

function process(A&B $input) {
    // $input は A と B の両方を実装する必要がある
}

never リターン型(Never Return Type)

[編集]

never リターン型は、関数やメソッドが決して戻り値を返さない(例: 例外を投げる、プログラムを終了させる)ことを明示します。これにより、意図的に終了する関数を型として表現できます。

function redirect(string $url): never {
    header("Location: $url");
    exit(); // ここでスクリプトが終了するため、戻り値はない
}

ファイナルクラス制約(Final Class Constraints)

[編集]

PHP 8.1 では、final クラスをインターフェースやトレイトに対して制約として適用することが可能になりました。これにより、特定のクラスが拡張されないことを保証できます。

ファイバー(Fibers)

[編集]

PHP 8.1 におけるファイバー(Fibers)は、非同期プログラミングのための低レベルな構造を提供します。これにより、コルーチンのような機能をサポートし、より効率的な並行処理が可能になります。ファイバーは、従来の非同期処理とは異なり、より柔軟でコントロールが容易です。

$fiber = new Fiber(function() {
    echo "Fiber started\n";
    Fiber::suspend();
    echo "Fiber resumed\n";
});

$fiber->start();
echo "Main script\n";
$fiber->resume();

これにより、非同期処理が効率的に行えるようになります。

PHP 8.0 の新機能

[編集]

PHP 8.0は、2020年11月26日にリリースされ、多くの新機能や改良が加わりました。これにより、PHPのパフォーマンスが大幅に向上し、開発者にとってコードの柔軟性や可読性が向上しています。以下に、PHP 8.0の主な新機能を解説します。

Just-In-Time (JIT) コンパイル

[編集]

PHP 8.0で導入されたJITコンパイルは、コードの実行時に一部をネイティブコードにコンパイルする機能です。これにより、CPUバウンドのタスクが高速化され、PHPのパフォーマンスが向上します。特に計算量の多いスクリプトやループで効果が期待されますが、すべてのシナリオで劇的な改善が見られるわけではありません。

負のインデックスから始まる配列

[編集]

PHP 8.0では、配列のインデックスが負の値で始まる場合でも、期待通りに動作するようになりました。以前のバージョンでは配列が正のインデックスから始まることが一般的でしたが、PHP 8.0では負のインデックスもサポートされています。

$array = [-1 => 'a', 0 => 'b', 1 => 'c'];
print_r($array);
// 出力: Array ( [-1] => a [0] => b [1] => c )

より厳密で一貫した言語仕様

[編集]

PHP 8.0では、さまざまなセマンティクスや型エラーが改善され、言語がより厳密かつ一貫したものになりました。たとえば、抽象メソッドを持つトレイトに対する検証が強化され、メソッドシグネチャが不一致の場合に致命的エラーを投げるようになりました。

match

[編集]

switch文に代わる新しい制御構造としてmatch式が導入されました。matchは、より強力かつ表現力豊かで、式として使えるため値を返します。また、matchは型の厳密な比較を行うため、型の曖昧さを回避できます。

$result = match ($status) {
    'pending' => 'Processing',
    'completed' => 'Done',
    'failed' => 'Error',
    default => 'Unknown',
};

名前付き引数(Named Arguments)

[編集]

関数を呼び出す際に、引数の名前を指定して渡すことができる機能が追加されました。これにより、引数の順序を気にせずに特定の引数だけを渡すことが可能になります。また、可読性が向上し、デフォルト値の省略も簡単です。

function greet(string $name, string $greeting = 'Hello') {
    echo "$greeting, $name";
}

greet(name: 'PHP', greeting: 'Hi');
// 出力: Hi, PHP

コンストラクタプロパティプロモーション(Constructor Property Promotion)

[編集]

PHP 8.0では、クラスのプロパティを宣言し、コンストラクタで初期化するという従来の冗長なパターンを簡潔に記述できる機能が追加されました。これにより、コンストラクタでプロパティを定義するコードが短くなります。

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

$user = new User('John', 30);

ユニオン型(Union Types)

[編集]

ユニオン型は、複数の型を指定できる新しい型宣言機能です。これにより、変数や関数の引数、戻り値に複数の型を許容でき、より柔軟な型チェックが可能になります。

function process(int|string $input) {
    // $input は int または string 型が許容される
}

nullsafe 演算子

[編集]

PHP 8.0で導入されたnullsafe演算子は、オブジェクトがnullである場合でも安全にメソッドチェーンを処理できる機能です。従来のnullチェックを簡潔に書けるようになります。

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

throw

[編集]

throwが式として使えるようになり、これによりthrowをより柔軟な場所で利用できます。特に三項演算子や短絡評価と組み合わせてエラーハンドリングを簡潔に記述できます。

$isValid = $value !== null ?: throw new InvalidArgumentException('Value cannot be null');

その他の機能

[編集]
  • 一貫した内部関数の型エラー : PHP 8.0では、内部関数の型エラーが一貫してTypeErrorとして扱われます。
  • mixed : mixed型は、任意の型を許容することを明示するために使用されます。特に、任意の型を受け取る関数の定義に便利です。
  • ロケール非依存の浮動小数点から文字列への変換 : 浮動小数点を文字列に変換する際に、システムのロケール設定に影響されないようになりました。
  • JSON拡張が常に利用可能 : PHP 8.0では、JSON拡張が常に利用可能になり、追加の設定なしでJSON操作が可能です。

PHP 7.4 の新機能

[編集]

PHP 7.4 は、2019年11月28日にリリースされ、パフォーマンスと型安全性の向上が強調されました。

型付きプロパティ

[編集]

クラスのプロパティに型を指定できるようになり、型安全性が強化されました。

class User {
    public int $id;
    public string $name;
}

Preloading

[編集]

PHP 7.4 では、特定のスクリプトをサーバー起動時にメモリに読み込む「preloading」機能が追加され、パフォーマンスが向上しました。

Null 合体代入演算子

[編集]

??= 演算子が追加され、null でない場合に値を設定する簡便な方法が提供されました。

$data['key'] ??= 'default';

外部関数インターフェース(FFI)

[編集]

C 言語のライブラリを PHP から直接呼び出すための FFI(Foreign Function Interface)が導入されました。

PHP 7.3 の新機能

[編集]

PHP 7.3 は、2018年12月6日にリリースされ、開発者の利便性を向上させるための構文と機能が追加されました。

柔軟な Heredoc と Nowdoc 構文

[編集]

Heredoc と Nowdoc の構文がより柔軟になり、インデントや改行の処理が簡素化されました。

echo <<<EOD
    これは、インデント付きの
    Heredoc の例です。
EOD;

hrtime() 関数

[編集]

高精度な時間を取得するための hrtime() 関数が追加されました。これにより、より正確な時間計測が可能となりました。

PHP 7.2 の新機能

[編集]

PHP 7.2 は、2017年11月30日にリリースされ、セキュリティと型に関する機能が強化されました。

object 型宣言

[編集]

パラメータと戻り値に対して、object 型の宣言が可能になりました。これにより、特定のクラスインスタンスではなく、任意のオブジェクト型を受け取れるようになります。

function setObject(object $obj): void {
    echo get_class($obj);
}

Libsodium 拡張モジュール

[編集]

PHP 7.2 では、安全な暗号化ライブラリである libsodium が標準で組み込まれました。

PHP 7.1 の新機能

[編集]

PHP 7.1 は、2016年12月1日にリリースされ、型安全性やコードの柔軟性がさらに強化されました。

新しい型サポート

[編集]
  • nullable 型: 型宣言に ? を使用することで、null を許容する型を定義できるようになりました。
  • void 型戻り値: 関数の戻り値が何も返さないことを明示するために void 型が導入されました。
function setName(?string $name): void {
    if ($name !== null) {
        echo "Name: $name";
    }
}

クラス定数の可視性修飾子

[編集]

クラス定数に public, protected, private の可視性修飾子が適用可能になりました。

マルチキャッチ例外処理

[編集]

一つの catch ブロックで複数の例外タイプを捕捉できるようになりました。

try {
    // 実行するコード
} catch (FirstException | SecondException $e) {
    echo $e->getMessage();
}

PHP 7.0 の新機能

[編集]

PHP 7.0 は、2015年12月3日にリリースされ、言語のパフォーマンス向上や新しい構文サポートが追加されました。

Zend Engine 3 とパフォーマンス向上

[編集]

PHP 7.0 では、新しい Zend Engine 3 が導入され、パフォーマンスが大幅に向上しました。特に、64ビット整数が Windows でサポートされ、より効率的なメモリ管理が可能となりました。

一貫した変数構文

[編集]

変数のアクセス方法が一貫した構文に変更され、読みやすさと予測可能性が向上しました。

AST(抽象構文木)ベースのコンパイル

[編集]

PHP 7.0 では、抽象構文木 (AST) を用いた新しいコンパイルプロセスが導入され、コードの解析と最適化が効率化されました。

新しい演算子と機能

[編集]
  • ?? (Null 合体演算子): 変数が null かどうかを簡単に確認できます。
  • <=> ("宇宙船" 三方比較演算子): 二つの値を比較し、1、0、-1 を返す便利な演算子です。
  • 匿名クラス: 簡単にクラスのインスタンスを作成できるようになりました。
$anonymous = new class {
    public function greet() {
        return 'Hello, World!';
    }
};

スカラー型宣言と戻り値の型宣言

[編集]

スカラー型(整数、浮動小数点、文字列、ブール)の型宣言がサポートされ、関数の戻り値にも型を指定できるようになりました。