我有以下继承结构的3个类:
<?php
class admin {
function __construct($module){
echo $module;
}
}
class user_admin extends admin {
function __construct(){
parent::__construct('user');
}
}
class sales_admin extends user_admin {
function __construct(){
parent::__construct('sales');
}
}
您会注意到sales_admin扩展了user_admin,这是一个必要的步骤。当我运行这段代码时,
$a = new sales_admin;
将返回"user",因为它将"sales"字符串传递给user_admin,而user_admin不接受构造函数。
是否有一种方法可以访问它上面的父类的构造函数而不改变user_admin,这是我无法控制的?
直接引用类:
class sales_admin extends user_admin
{
function __construct()
{
admin::__construct('sales');
}
}
$a = new sales_admin; // outputs 'sales'
由于user_admin扩展了admin,而sales_admin扩展了user_admin,因此sales_admin将具有admin构造函数的作用域
//super implimentation php
class object extends other_object {
function __construct(){
$this->super();
}
function super() {
$parentClass = get_parent_class($this);
$this->$parentClass();
}
}
sales_admin知道它有父类,因为它扩展了user_admin。但是,sales_admin怎么可能知道user_admin是否有父节点呢?在PHP中,sales_admin没有办法知道——除非你用反射作弊。
你有一个选项是借用admin的构造函数。可以通过调用admin::__construct('sales');
来实现。请注意,您可以通过这种方式借用任何类的方法,而不必考虑继承树——也就是说,调用者不必是被调用者的后代。
尽管有这个选项,我还是建议您修改您的设计,使您可以完全避免继承。