【问题标题】:how to access the super class from a child class in php如何从php中的子类访问超类
【发布时间】:2011-07-22 02:39:00
【问题描述】:

我有 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 的情况下访问它上面的父级的构造函数?

【问题讨论】:

  • 需要实际代码和您遇到的问题。您是否试图呼应“销售”?你应该有 getter 和 setter 来让你改变其他事情,除非父级静态地做事情,然后你只是运气不好,破坏了 OO 的目的。

标签: php class inheritance


【解决方案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 的构造函数是公共的,因此可以在任何地方访问。
  • 在这个例子中它可以是任何一个,你是对的,但是在一个正常的应用程序中,如果sales_admin 不是一个后代,则必须包含admin 类。我的想法是这样的,你的想法是另一个。我想这对 OP 来说是件好事 :)
  • 澄清一下,如果没有包含 admin 类,sales_admin 不能扩展 admin。
  • 它没有,它扩展了 user_admin,它扩展了 admin。我们必须假设 user_admin 对 admin 类具有可见性。
【解决方案2】:
//super implimentation php

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

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

【讨论】:

    【解决方案3】:

    sales_admin 知道它有一个父级,因为它正在扩展 user_admin。但是,sales_admin 怎么可能知道 user_admin 是否有父级?在 PHP 中,sales_admin 没有办法知道——除非你用反射作弊。

    您确实有一个选择是借用管理员的构造函数。您可以通过调用admin::__construct('sales'); 来完成此操作。请注意,您可以通过这种方式借用任何类的方法,而不管继承树如何——也就是说,调用者不必是被调用者的后代。

    尽管有这个选项,我还是建议您更改您的设计以完全避免继承。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2013-01-04
      • 2012-04-09
      • 2013-03-24
      • 2017-09-13
      • 2018-10-14
      • 1970-01-01
      相关资源
      最近更新 更多