【问题标题】:php class extends - attributes/methods with same name ok?php 类扩展 - 具有相同名称的属性/方法好吗?
【发布时间】:2024-08-13 19:50:02
【问题描述】:

如果您有一个名为“User”的类和另一个名为“Admin”的类扩展了“User”,并且您希望 Admin 继承 User 的所有属性、方法,例如 __construct 方法除外。

class User {
private $name;

function __construct($name) {
$this->name = $name;
}
}

class Admin extends User {
private $authorization;

function __construct($name,$authorization) {
$this->name = $name;
$this->authorization = $authorization;
}
}

这是正确的吗?管理员是否覆盖用户的构造方法?如果扩展类具有相同的方法名称,我认为它是无效的。 我完全错过了类扩展的意义吗?

【问题讨论】:

    标签: php class extends


    【解决方案1】:

    这不是无效的。类继承的一个方面是,您可以覆盖方法并提供另一种实现。

    但在你的情况下,我会这样做

    class Admin extends User {
        private $authorization;
    
        function __construct($name,$authorization) {
            parent::__construct($name);
            $this->authorization = $authorization;
        }
    }
    

    因为您已经在父类中实现了“名称分配”。这是一种更清洁的方法。

    【讨论】:

      【解决方案2】:

      不,这是完全合法的,因为您正在覆盖用户的构造函数。一般来说,扩展类中具有相似名称的方法会“覆盖”其父类的方法。

      请记住,尽管修饰符确实在这里发挥了作用:超类中的“私有”声明方法不会被覆盖,因为它们不会被扩展类继承。 “最终”声明的方法不能被扩展类覆盖 - 在任何情况下。

      【讨论】:

        【解决方案3】:

        是的,这就是extends的用途。 您可以覆盖所有方法。

        你甚至可以在子类的方法中使用同名的父类。

        见:parent keyword

        【讨论】:

          最近更新 更多