访问父母父类

时间:2018-02-05 18:06:00

标签: php class oop parent-child extends

我有下面的类结构。我想知道如何从班级$varA访问C。如果我更改了课程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';
  }
}

2 个答案:

答案 0 :(得分:1)

根据您的问题,听起来您可能误解了类和对象之间的区别。将类视为创建对象的规范。您并不是真的要在代码中操作类,而是要从这些类创建对象并使用这些类的实例。像你所展示的那些课程在他们被实例化之前并不是真的。

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

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

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

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

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

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

答案 1 :(得分:0)

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

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