访问父级 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 的属性;在这种情况下 A
和 B
。这些属性可在 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 设置相同。
我有下面的 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 的属性;在这种情况下 A
和 B
。这些属性可在 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 设置相同。