【问题标题】:php class extends overwrite propetry and methodphp 类扩展覆盖属性和方法
【发布时间】:2015-01-08 13:46:27
【问题描述】:

考虑以下示例。 b 类正在扩展 a 类。

1) 类b扩展类a时,会覆盖属性a的值吗?

2) 类b扩展类a时,会覆盖方法say吗?

class a  {
public $a = 5;
function say() {
echo "Hi";
}
}

class b extends a {
public $a = 6;
function say() {
echo "Hi";
}
}

【问题讨论】:

  • 变量名前缺少 $
  • 为什么不直接测试一下?
  • 但我可以使用 b 类中的父级访问 a 类属性和方法?如何?如果 b 类覆盖了 a 类的属性和方法?
  • @vivek2015 B 类没有overwrite 方法,它是overrides 方法。类 A 中的实际方法仍将存在以供其他实例/子级使用。
  • 方法可以通过 parent::method() 访问(在您的示例中: parent::say() )。但通常没有必要这样做(原因请参见此处:stackoverflow.com/questions/11237511/…)。无法直接访问覆盖的属性,您必须使用反射类。这在生产代码中通常也不是必需的。我怀疑您将“类”(一种模板)与“对象”(类的具体实例)混淆了

标签: php class oop


【解决方案1】:

是的,是的。

扩展类后,您可以更改默认值。

请参阅PHP: Visibility 了解更多信息。

【讨论】:

  • 但我可以使用 b 类中的父级访问 a 类属性和方法?如何?如果 b 类覆盖了 a 类的属性和方法?
【解决方案2】:

两者都是。在属性情况下,它将覆盖它的默认值。

【讨论】:

    【解决方案3】:

    什么都同意。

    面向对象编程具有继承性,如果子级重新声明/重新定义方法或属性,则父级将被更改。子类通常用于提供更具体的功能,而父类用于一般功能。

    如果您希望保留父级,则可以使用以下方法。

    class A {
        public $a = 5;
        function say() {
            echo 'Hi';
        }
    }
    
    class C extends A {
        /* specific functionality here */
    }
    

    相关的官方文档在这里:http://php.net/manual/en/language.oop5.inheritance.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      相关资源
      最近更新 更多