現代的なPHPは、関数パラメータ、戻り値、クラスプロパティに対する型宣言をサポートしており、**declare(strict_types=1)**でそれらを厳密に強制できます。これらを組み合わせることで、PHPに静的型付け言語の安全性の多くをもたらし、バグを早期に検出します。
あらゆる場所の型宣言
<?php
class Account {
public float $balance = 0.0; // typed PROPERTY (PHP 7.4+)
private ?string $note = null; // nullable type
public function deposit(float $amount): void { // typed param + return
$this->balance += $amount;
}
public function getBalance(): float { // typed return
return $this->balance;
}
}
パラメータ、戻り値、クラスプロパティに型を付けることができます。型にはスカラー型(int、float、string、bool)、クラス/インターフェース、array、?Type(null許容)、voidが含まれます。
Union、intersection、特別な型(PHP 8)
function process(int|string $id): User|null { } // union type — int OR string
function handle(Countable&Iterator $x): void { } // intersection (PHP 8.1) — BOTH
function get(): static { } // return the called class's type
function nothing(): never { } // never returns (throws/exits, PHP 8.1)
PHP 8ではunion型(int|string)、intersection型、特別な戻り値型(static、never)が追加されました。
strict_types: 重要なトグル
<?php
declare(strict_types=1); // MUST be the first statement in the file
function add(int $a, int $b): int { return $a + $b; }
add(5, 3); // ✅ 8
add("5", 3); // ❌ TypeError — strict_types REJECTS the string (no coercion)
WITHOUT strict_types (default "coercive" mode):
add("5", 3) → "5" is silently coerced to int 5 → returns 8 (lenient, can hide bugs)
WITH strict_types=1:
add("5", 3) → TypeError immediately (must pass the exact declared type)
declare(strict_types=1)は、緩和された型強制から厳密な強制へ切り替えます。PHPは型の不一致を暗黙的に変換せず、拒否します。これにより、型強制が隠すバグを検出できます。
なぜ重要なのか
型宣言とstrict_typesは堅牢で保守しやすい現代的なPHPを書くために重要であり、これは言語が緩い型付けの起源を超えた大きな進化を表しています。
パラメータ、戻り値、プロパティに対する型宣言は、コードを自己ドキュメント化し(署名は明確に期待値を述べる)、PHPが型エラーを自動的に検出できるようにします。一方、現代的な追加機能(union型、null許容型)は署名をより正確にします。
もっとも重要な慣例は**declare(strict_types=1)**です。PHPを緩い型強制("5"が暗黙的に5になり、潜在的にバグを隠す)から厳密な強制(型の不一致を明確なTypeErrorで拒否する)へ切り替えます。これはバグを早期に検出し、信頼性の高いコードを書くための重要なツールであり、現代的なデフォルトとして推奨されています。
型宣言とstrict_typesの理解は、現代的なPHP開発における専門的で日常的な知識です。これはPHPに静的型付け言語の安全性の多くをもたらし、コードをより堅牢で保守しやすくします。
現代的なPHPフレームワークと良く書かれたコードベースは広範に型付けを使用し(全体を通じてstrict_typesを使用),この知識を習得することは質の高い現代的なPHPを書き、使用するために不可欠です。これは古いPHPの型安全でない緩い型付けスタイルと型安全な現代的なコードを区別します。
