PHPのエイリアスと例外の関係について
PHPでエイリアスを利用する際、エイリアス元と同じように例外をキャッチできるかどうか気になったので、実際に検証してみました。今回の検証はPHP 8.0を前提に行っています。
環境情報
$ php -v
PHP 8.0.30 (cli) (built: Apr 10 2024 07:34:47) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.30, Copyright (c) Zend Technologies
サンプルコード
次のコードで、エイリアスと例外の関係を検証します。
<?php
class ParentException extends Exception {} // 親の例外
class TargetException extends ParentException {} // 検証対象の例外
class_alias(TargetException::class, 'AliasException'); // 検証対象の例外のエイリアス
// TargetException を直接キャッチする場合
try {
throw new TargetException();
} catch (TargetException) {
echo 'TargetException でキャッチできた!' . PHP_EOL;
} catch (Exception) {
echo 'TargetException でキャッチできなかった…' . PHP_EOL;
}
// TargetException を AliasException でキャッチする場合
try {
throw new TargetException();
} catch (AliasException) {
echo 'TargetException を AliasException でキャッチできた!' . PHP_EOL;
} catch (Exception) {
echo 'TargetException を AliasException でキャッチできなかった…' . PHP_EOL;
}
// TargetException を ParentException でキャッチする場合
try {
throw new TargetException();
} catch (ParentException) {
echo 'TargetException を ParentException でキャッチできた!' . PHP_EOL;
} catch (Exception) {
echo 'TargetException を ParentException でキャッチできなかった…' . PHP_EOL;
}
// AliasException を直接キャッチする場合
try {
throw new AliasException();
} catch (AliasException) {
echo 'AliasException でキャッチできた!' . PHP_EOL;
} catch (Exception) {
echo 'AliasException でキャッチできなかった…' . PHP_EOL;
}
// AliasException を TargetException でキャッチする場合
try {
throw new AliasException();
} catch (TargetException) {
echo 'AliasException を TargetException でキャッチできた!' . PHP_EOL;
} catch (Exception) {
echo 'AliasException を TargetException でキャッチできなかった…' . PHP_EOL;
}
// AliasException を ParentException でキャッチする場合
try {
throw new AliasException();
} catch (ParentException) {
echo 'AliasException を ParentException でキャッチできた!' . PHP_EOL;
} catch (Exception) {
echo 'AliasException を ParentException でキャッチできなかった…' . PHP_EOL;
}
実行結果
$ php exception-test.php
TargetException でキャッチできた!
TargetException を AliasException でキャッチできた!
TargetException を ParentException でキャッチできた!
AliasException でキャッチできた!
AliasException を TargetException でキャッチできた!
AliasException を ParentException でキャッチできた!
検証結果と考察
結果から、エイリアス元の例外とエイリアスは同一のものとして扱われ、両方で正常にキャッチできることが確認できました。
このため、たとえフレームワークなどによって例外のエイリアスが自動生成された場合でも、エイリアスを利用して例外処理が行えるため、安心して使用できます。