1

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

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 实例,一个用于父类,一个来自当前扩展 Module 的类。我不明白为什么我有两个 _actionHandlers?在子类中声明它时我不应该覆盖它,因为现在 _prepareActionObject 正在寻找错误的位置,我得到了这个讨厌的错误......

4

1 回答 1

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'
        );
}

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

[编辑了这里的内容]

于 2013-01-19T07:10:33.750 回答