如何在PHP中从子类访问超类

3

我有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?


需要实际的代码和你遇到的问题。你是想回显“销售”吗?你应该有getter和setter,这应该允许你改变其他东西,除非父类是静态地执行操作,那么你就没有办法了,而且这也违背了面向对象编程的初衷。 - iLLin
3个回答

1
直接引用类即可:
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 构造函数的范围。


sales_admin 可以调用 admin::__construct(),但 sales_admin 是 admin 的子类并不是这个原因。在作用域参数上,admin 的构造函数是公共的,因此可以在任何地方访问。 - erisco
在这个例子中,你是正确的,但在正常的应用程序中,如果 sales_admin 不是一个后代,则必须包括 admin 类。我的想法走了一条路,你的想法走了另一条路。我想对 OP 来说,知道两者都很好 :) - AlienWebguy
并且需要澄清的是,如果没有包含admin类,sales_admin无法扩展admin。 - erisco
它并不是直接继承admin类,而是继承了user_admin类。我们必须假设user_admin类对admin类有可见性。 - AlienWebguy

0
//super implimentation php

class object extends other_object {
    function __construct(){
        $this->super();
    }

    function super() {
        $parentClass = get_parent_class($this);
        $this->$parentClass();
    }
}

0

sales_admin 知道它有一个父类,因为它正在扩展 user_admin。 但是,sales_admin 如何知道 user_admin 是否有一个父类呢?在 PHP 中,sales_admin 没有办法知道 - 除非你使用反射来作弊。

您可以借用 admin 的构造函数来解决这个问题。您可以通过调用 admin::__construct('sales') 来实现此目的。请注意,您可以以此方式借用任何类的方法,而不管继承树如何 - 也就是说,调用者不必是被调用者的后代。

尽管有了这个选项,我仍然建议您更改设计,以便避免继承。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接