所以,我有这个基本结构:
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看错了地方,我得到了这个令人讨厌的错误...
答案 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'
);
}
编辑:我的错误,我在没有正确审核代码的情况下提出建议......
[编辑了这里的内容]