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,则不适用于您),我对其进行了修订,因为它不太可能影响您。