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


Extending abstract class gives strange error while accessing variables

同学们,我有了这个基本结构:

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]();

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

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

你们可以看到我得到_actionHandlers的两个实例一个为父类和一个从当前类扩展模块。我不明白为什么我有两个_actionHandlers?我是不是应该在子类中声明它时覆盖它,因为现在_prepareActionObject找错了地方我得到了这个讨厌的错误。

这是预期的行为。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'
        );
}

EDIT:我的错误,我在没有正确审查代码的情况下给出了建议…

[编辑了这里的内容]