0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPのエイリアスと例外処理の関係を検証してみた

Posted at

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 でキャッチできた!

検証結果と考察

結果から、エイリアス元の例外とエイリアスは同一のものとして扱われ、両方で正常にキャッチできることが確認できました。
このため、たとえフレームワークなどによって例外のエイリアスが自動生成された場合でも、エイリアスを利用して例外処理が行えるため、安心して使用できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?