【问题标题】:Access parents parent class访问父母父类
【发布时间】:2018-07-15 16:11:34
【问题描述】:

我有下面的类结构。我想知道如何从C 类访问$varA。如果我在A 类中更改一个值,它在C 类中是否也可见?或者当我调用类C时,是否所有的值都转移到了新创建的类中?

class A {
  protected $varA;
  protected function functionA() {
    echo 'hello';
  }
}

class B extends A {
  protected $varB;
  protected function functionB() {
    echo 'world';
  }
}

class C extends B {
  protected $varC;
  protected function functionC() {
    echo 'Class C';
  }
}

【问题讨论】:

标签: php class oop parent-child extends


【解决方案1】:

根据您的问题,听起来您可能误解了类和对象之间的区别。将类视为创建对象的规范。您不会真的在代码中操作类,而是要从这些类创建对象并使用这些类的instances。在实例化之前,您所展示的类实际上什么都不是。

当您使用$c = new C; 创建类C 的实例时,生成的对象$c 将有权访问它所继承的任何类的所有公共和受保护属性;在这种情况下AB。这些属性可以在C 类中的任何位置访问。例如,您可以使用$this->varA 访问它们。

但是按照您编写的方式,没有一个类具有任何公共属性或方法。因此,您编写的任何使用它们的代码都无法访问 任何 属性。 protected 表示该属性或方法仅在从它继承的一个或多个类中可用。所以$c = new C;之后,你就不能调用$c->functionC(),也不能引用$->varA,甚至$c->varC

如果您创建A 的实例和C 的实例,这两个对象完全相互独立。 C的实例有自己的$varA,如果更改A实例中的$varA,不会影响C的实例。

这里有几个带有公共方法的示例类来演示这一点。

class A {
    protected $varA = 'a';
    public function changeA ($newValue) {
        $this->varA = $newValue;
    }
}

class B extends A {
    public function example()
    {
        echo $this->varA;
    }
}

如果你创建一个新的B,它的example方法会显示$varA中的继承值。

$instanceOfB = new B;
$instanceOfB->example();  // outputs a

那么如果你创建一个新的A,并改变它的$varA的值...

$instanceOfA = new A;
$instanceOfA->changeA('something else');  // varA in this object is modified

B 实例中$varA 的值不受影响。

$instanceOfB->example();  // still outputs a

我在示例中只使用了一层继承,但概念与您展示的 A/B/C 设置相同。

【讨论】:

  • 嗯...那么我完全错误地设计了我的课程... :( 感谢您的精彩解释!
【解决方案2】:

http://php.net/manual/en/language.oop5.visibility.php

class C extends B {
  protected $varC;
  protected function functionC() {
    $this -> $varA
  }
}

【讨论】:

  • 也许是一个愚蠢的问题,但我不确定是否在初始化 C 类后更改 A 类的值,更改是否也会在 C 类中可见?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2020-07-04
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多