扩展抽象类在访问变量时会出现奇怪的错误

时间:2013-01-19 06:58:04

标签: class php

所以,我有这个基本结构:

interface IModule {
    public function _prepareActionObj ();
}

abstract class Module implements IModule {

    private $_action = null,

            $_actionObj = null,

            $_actionHandlers = array();

    public function __construct() {
        $this->_action = GetParamDefault('action', '');
        $this->_prepareActionObj();
    }

    private function _prepareActionObj () {
        $this->_actionObj = new $this->_actionHandlers[$this->_action]();
    }

}
到目前为止没什么奇怪的。但是当我这样做时:

 class AdminHomeModule extends Module {
     private
         $_actionHandlers = array(
             '' => 'AdminModuleHomeAction'
         );
 }

并创建AdminHomeModule的新实例我收到此错误

Undefined index: on line 22 in ....\interfaces\IModule.php

这是非常好的

$this->_actionObj = new $this->_actionHandlers[$this->_action]();

当我在Module构造函数中转储$ this时,我得到了这个

AdminHomeModule Object
(
    [_actionHandlers:AdminHomeModule:private] => Array
        (
            [] => AdminModuleHomeAction
        )

    [_action:Module:private] => 
    [_actionObj:Module:private] => 
    [_actionHandlers:Module:private] => Array
        (
        )

)

你们可以看到我得到两个_actionHandlers实例,一个用于父类,另一个来自当前扩展Module的类。我不明白为什么我有两个_actionHandlers?我不应该在子类中声明它时覆盖它,因为现在_prepareActionObject看错了地方,我得到了这个令人讨厌的错误...

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 private类初始化程序意味着只允许 类访问此属性。如果类为abstract,则不会更改。

您可以做的是将抽象类初始化程序和继承类声明为受保护,并且所有继承类都可以访问相同的属性。

abstract class Module implements IModule {

    protected $_action = null,

            $_actionObj = null,

            $_actionHandlers = array();

    public function __construct() {
        $this->_action = GetParamDefault('action', '');
        $this->_prepareActionObj();
    }

    private function _prepareActionObj () {
        $this->_actionObj = new $this->_actionHandlers[$this->_action]();
    }

}

class AdminHomeModule extends Module {
    proteced
        $_actionHandlers = array(
            '' => 'AdminModuleHomeAction'
        );
}

编辑:我的错误,我在没有正确审核代码的情况下提出建议......

[编辑了这里的内容]