同学们,我有了这个基本结构:
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:我的错误,我在没有正确审查代码的情况下给出了建议…
[编辑了这里的内容]