我有一个父类:
Abstract Class Base {
function __construct($registry) {
// stuff
}
}
然后我至少有两个扩展该类的类
class Cms extends Base {
// a few functions here
}
和这一个
class Index extends Base {
// a few functions here
}
对于CMS类,用户需要登录。会话已经启动,我想通过使用会话var来检查用户是否已登录。所以我想做的是:
class Cms extends Base {
function __construct()
{
// check the user session is valid
}
// a few functions here
}
但当然会覆盖父构造类及其设置的所有内容。有没有办法让__construct()类型的方法可以在子类中定义?
答案 0 :(得分:8)
从子构造函数中,您可以调用父项的构造函数:
class Cms extends Base {
function __construct()
{
parent::__construct();
// check the user session is valid
}
// a few functions here
}
请参阅本手册Constructors and Destructors页面上的示例,以及(引用)注释:
注意:父构造函数不是 如果子类隐式调用 定义构造函数。
按顺序 运行父构造函数,调用parent::__construct()
内的{{1}} 子构造函数是必需的。
答案 1 :(得分:6)
类的构造函数的调用在php中不会自动冒泡。您必须手动添加对父构造函数的调用。 (我认为这是一个缺陷。)
class Cms extends Base {
function __construct()
{
parent::__construct();
// check the user session is valid
}
// a few functions here
}
PHP: Scope Resolution Operator (::)说:
当扩展类重写方法的父类定义时,PHP不会调用父方法。关于父方法是否被调用,取决于扩展类。这也适用于构造函数和析构函数,重载和Magic方法定义。
答案 2 :(得分:0)
这个解决方案在处理类扩展时也适用于所有php魔术方法,即如果你覆盖__set(),你可以使用相同的代码(parent :: __方法)来确保你获得的所有行为也在父母班。
VolkerK:为什么这会是一个缺陷?如果您要覆盖方法的基类行为,那么您可能希望替换该行为,除非您另行明确声明。如果我可以扩展一个方法,但是总是在父类中调用默认行为,以及我正在做的事情,我会觉得非常痛苦。其他OO语言是这样实现的吗?