是否有扩展类的__construct()等价物

时间:2009-12-21 10:14:01

标签: php class

我有一个父类:

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()类型的方法可以在子类中定义?

3 个答案:

答案 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语言是这样实现的吗?