为什么PHP异常类中的所有方法都是最终的?

时间:2017-03-28 08:54:51

标签: php

我试图覆盖getMessage()以给返回消息一个默认值,但失败了,因为PHP Exception类中的所有方法都是最终的。

现在我只是好奇它为什么。我知道我可以通过添加代理方法来解决这个问题。

3 个答案:

答案 0 :(得分:3)

他们是final,以确保它们在所有继承的class es中以完全相同的方式工作。程序员希望getMessage以完全相同的方式为class直接或传递的所有Exception es工作。您可以在构造函数中设置消息,因为您可以为您的类编写自己的构造函数。

答案 1 :(得分:1)

我的印象是你需要这样的模式:

<?php

class UserNotFoundException extends \RuntimeException {
    const MESSAGE_TEMPLATE = 'Could not find the requested user: %s';

    public static function fromId($user_id) {
        $message = sprintf(self::MESSAGE_TEMPLATE, "ID=$user_id");
        return new self($message);

    }
    public static function fromName($name) {
        $message = sprintf(self::MESSAGE_TEMPLATE, "name=$name");
        return new self($message);
    }
}

try {
    throw UserNotFoundException::fromId(314);
} catch (RuntimeException $e) {
    echo $e->getMessage() . PHP_EOL;
}
try {
    throw UserNotFoundException::fromName('john');
} catch (RuntimeException $e) {
    echo $e->getMessage() . PHP_EOL;
}
Could not find the requested user: ID=314
Could not find the requested user: name=john

根据您的确切需要调整它。这对于重用非常实用,并且不会有干扰整体异常机制的风险。

答案 2 :(得分:-2)

编写自己的例外。

class MyException extends \Exception
{

}