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

Class 扩展抽象类在访问变量时会出现奇怪的错误,class,php,Class,Php,伙计们,我有一个基本结构: interface IModule { public function _prepareActionObj (); } abstract class Module implements IModule { private $_action = null, $_actionObj = null, $_actionHandlers = array(); public function __c

伙计们,我有一个基本结构:

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

)

你们可以看到,我得到了两个_ActionHandler的实例,一个用于父类,另一个来自扩展模块的当前类。我不明白为什么我有两个动作处理程序?我不应该在子类中声明它时覆盖它,因为现在_prepareActionObject正在错误的位置查找,我得到了这个严重的错误…

这是预期的行为。
private
类初始值设定项表示只允许该类访问此属性。如果类是
抽象的
,则不会更改

相反,您可以将抽象类初始值设定项和继承类声明为受保护,这样所有继承类都可以访问相同的属性

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'
        );
}
编辑:我的错误是,我没有正确地检查代码就给出了建议


[编辑此处内容]

这是预期行为。
private
类初始值设定项表示只允许该类访问此属性。如果类是
抽象的
,则不会更改

相反,您可以将抽象类初始值设定项和继承类声明为受保护,这样所有继承类都可以访问相同的属性

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'
        );
}
编辑:我的错误是,我没有正确地检查代码就给出了建议


[编辑此处内容]

非常感谢您的回答!成功了。但是有一件事你错了,除了在接口中声明公共方法之外,你不能在接口中声明其他方法,因为它是在php文档中编写的“在接口中声明的所有方法都必须是公共的,这是接口的本质。”:)@shaddy你是对的。我想说的与抽象类可见性最近的变化有关(如果您使用的是PHP<5.5.0,则不适用于您),我对其进行了修订,因为它不太可能影响您。非常感谢您的回答!成功了。但是有一件事你错了,除了在接口中声明公共方法之外,你不能在接口中声明其他方法,因为它是在php文档中编写的“在接口中声明的所有方法都必须是公共的,这是接口的本质。”:)@shaddy你是对的。我想说的与抽象类可见性的最近变化有关(如果您使用的是PHP<5.5.0,则不适用于您),我对其进行了修订,因为它不太可能影响您。