PHPでは連想配列は便利ですが、型の保証がなく、意図しない値が入るリスクがあります。一方でクラスを定義すれば型を保証できますが、処理フローとは別に管理する必要があり、手軽さが失われます。この記事では、連想配列の手軽さと型安全性のハイブリッド的アプローチを解説します。
連想配列に型を持たせる従来の方法
一般的には、型安全を実現するためにクラスを作り、プロパティに型を定義します。PHP 7.4以降では型宣言が可能になったため、プロパティやメソッド引数に型を付与することで、連想配列の代替として安全に扱えます。
例:
class User {
public string $name;
public int $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
}
$user = new User('Alice', 30);
連想配列の手軽さを失わずに型安全性を高める手法
PHP 8.1からは「readonlyプロパティ」や「enum」なども活用できます。また、型チェック用のライブラリや、Value Objectパターンを使うことで、連想配列的な柔軟性をある程度保持しつつ、型安全性を高められます。
例として、型付き配列ラッパーを作る方法があります:
class TypedArray {
private array $data = [];
public function set(string $key, int $value): void {
$this->data[$key] = $value;
}
public function get(string $key): int {
return $this->data[$key];
}
}
$arr = new TypedArray();
$arr->set('score', 100);
$score = $arr->get('score');
既存のライブラリやフレームワークの活用
LaravelやSymfonyなどのフレームワークでは、DTO(Data Transfer Object)や型付き配列をサポートする仕組みがあります。これにより、連想配列のような柔軟性を維持しながら、型チェックやバリデーションを組み込みやすくなります。
まとめ
PHPで連想配列の手軽さと型安全性を両立させるためには、単純な配列だけでなく、クラスやValue Object、ライブラリを活用する方法があります。処理フローと別にクラスを書く必要はありますが、型安全性を保証することで、バグの予防やコードの可読性向上につながります。完全にフロー内で型付き連想配列を扱うという思想はPHPには標準ではありませんが、ラッパークラスやDTOで実現可能です。


コメント