【问题标题】:Code confusion while extending PHP exception class扩展 PHP 异常类时的代码混乱
【发布时间】:2014-04-14 17:59:23
【问题描述】:

这个问题与扩展 PHP 异常类有关,有很多类似的问题,但这个问题不同。

我正在尝试扩展 PHP 异常类,以便可以将某些值添加到异常消息中。下面是我的代码。

class Om_Exception extends Exception {

    public function __construct($message, $code = 0, Exception $previous = null) {
        $message = $this->_getMessage($message);
        parent::__construct($message, $code, $previous);
    }

    protected function _getMessage($message) {
        $exception = '<br />';
        $exception .= '<b>Exception  => </b>'.$message.'<br />';
        $exception .= '<b>Class => </b>'.get_called_class().'<br />';
        $exception .= '<b>Error Line => </b>'.$this->getLine().'<br />';
        $exception .= '<b>Error File => </b>'.$this->getFile().'<br />';
        return $exception;
    }

}

这很好用。这就是我的问题。

由于我在调用父类的构造函数之前调用了父类的函数getLine()getFile(),它们不应该返回空白值吗?如果没有错误?

但这工作正常,我得到下面描述的输出。

Exception => hello..
Class => Om_Controller_Exception
Error Line => 30
Error File => C:\Users\Jay\Projects\order-manager\application\modules\default\controllers\LoginController.php 

谁能帮我理解为什么会出现这种行为?在初始化类之前如何使用类方法?

【问题讨论】:

  • “在调用它的构造函数之前”是什么意思?你的类有构造函数,它显式调用父构造函数
  • @AlmaDo 在调用父构造函数之前调用_getMessage()方法,该方法调用父类的getLine()和getFile()方法。
  • 那又怎样?您的方法将被继承,它们的实现也将被继承。因此,您的通话将使用标准的Exception 方法
  • 构造函数初始化属性,而不是方法。您可以在父构造函数之前调用任何方法,除非它不使用未初始化的属性
  • Exception 是 PHP 中一个特殊的内置类。 $code$file$line 属性在构造函数执行之前填充。

标签: php exception exception-handling


【解决方案1】:

在新创建的对象上调用构造函数,因此在调用构造函数时对象及其所有属性和方法已经存在。这个例子应该很清楚:

<?php

class testParent {
    protected $protectedStuff = 1;
    public function __construct($intNumber) {
        $this->protectedStuff = $intNumber;
    }
}
class testChild extends testParent {
    public function __construct($intNumber) {
        echo get_class() . '<br />'; // testChild
        echo get_parent_class() . '<br />'; // testParent
        $this->printStuff(); // 1
        parent::__construct($intNumber);
        $this->printStuff(); // 42
    }
    public function printStuff() {
        echo '<br />The number is now: ' . $this->protectedStuff;
    }
}
$objChild = new testChild(42);

结果

测试孩子

测试父母

现在的数字是:1

现在是:42

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多