かっこうのブログ

何かしら飲んでるエンジニア

PHPのException基底クラスの歴史

少し古いPHPを触れることがあるのですが、普段の書き方をした結果落ちるなどがあったのでPHPにおけるExceptionの変遷を調べてみました。

といっても、当時のブログの断片集のようになっていますが、PHPのバージョンでExceptionがおかしいぞ?となった時の参考になれば幸いです。

PHP5 ~Exceptionの始まり~

2004年、PHP5と共にPHPのExceptionは始まりました。

当時はプログラミングの言葉も知らないべいびーだったので、当時を知る由もありませんんが、こちらのブログで温度感を推し量れます。

PHP5の例外機能の使い方 - Blog::koyhoge::Tech

当時のExceptionの拡張はこのような感じです。

<?php
/**
 * Define a custom exception class
 */
class MyException extends Exception
{
    // Redefine the exception so message isn't optional
    public function __construct($message, $code = 0) {
        // some code
    
        // make sure everything is assigned properly
        parent::__construct($message, $code);
    }

    // custom string representation of object
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }

    public function customFunction() {
        echo "A custom function for this type of exception\n";
    }
}

PHP5.3 ~例外がネストできるように~

PHP5.3から、例外がネストできるようになります。例外のネスト...?という感じですが、直前の例外の情報を持った例外が作れるようになっただけです。

PHPのDocからの引用になりますが、Exceptionクラスの第3引数にpreviousを取れるようになっています。

<?php
/**
 * Define a custom exception class
 */
class MyException extends Exception
{
    // Redefine the exception so message isn't optional
    public function __construct($message, $code = 0, Exception $previous = null) {
        // some code
    
        // make sure everything is assigned properly
        parent::__construct($message, $code, $previous);
    }

    // custom string representation of object
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }

    public function customFunction() {
        echo "A custom function for this type of exception\n";
    }
}

PHP 5.3で追加された例外のうんたらかんたら - ゆっくり*ゆっくり

Extending Exceptions

PHP7 ExceptionクラスがThrowableの実装になる

PHP7からはThrowableというインターフェースが作られ、ExceptionはThrowableの実装に変わりました。

といっても、Throwableの実装を独自に行うことはできないため、Exceptionクラスを継承し独自クラスを作る形は変わりません。

Throwable

PHP のクラスが Throwableインターフェイスを直接実装することはできません。 そのかわりに、Exception を継承する必要があります。

PHP: 下位互換性のない変更点 - Manual

追いきれていないもの

この辺のErrorなどの詳細の歴史は割愛します。