访问父级 class

Access parents parent class

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

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';
  }
}

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

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

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

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

但是按照您的书写方式,class 中的 none 具有任何 public 属性或方法。因此,您编写的任何使用它们的代码都无法访问 any 属性。 protected 意味着 属性 或方法只能在继承它的 class 或 class 中使用。所以在$c = new C;之后,你将无法调用$c->functionC(),你将无法引用$->varA,甚至$c->varC

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

这里有几个示例 classes 和 public 方法来证明这一点。

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 设置相同。