0

我正在使用旧的 Cakephp 版本 0.2.9

我试图写一个构造函数

function __construct 并且 function __construct()具有相同的类名

但是所有的错误都像致命错误:在..中的非对象上调用成员函数 init()

4

1 回答 1

2

覆盖方法时调用父级

问题中没有详细信息,但很可能已定义的新构造函数没有调用父级

IE

class Parent {

    protected $_name = '';

    public function __construct($name) {
        $this->_name = $name;
    }

    public function greet() {
        if (!$this->_name) {
            throw new Exception("I got no name");
        }
        return sprintf('Hi, I\'m %s', $this->_name);
    }
}

class Child extends Parent {

    public function __construct() {
        // some logic
    }
}

上面的代码示例有两个错误

  1. 无意中没有调用父类
  2. 更改方法签名

第一个错误的结果是它有效:

$Parent = new Parent('Bob');
echo $Parent->greet();

而这会引发异常:

$Child = new Child('Boblini');
echo $Parent->greet();

单独修复第一个问题仍然会导致抛出异常,因为子构造函数没有与父方法相同的参数,因此无法将缺少的参数传递给父方法。

概括

  • 总是调用被覆盖的方法(除非有特定的理由不这样做)
  • 确保方法签名与被覆盖的方法相同
于 2013-10-30T08:31:15.497 回答