我有下面的类结构。我想知道如何从班级$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';
}
}
答案 0 :(得分:1)
根据您的问题,听起来您可能误解了类和对象之间的区别。将类视为创建对象的规范。您并不是真的要在代码中操作类,而是要从这些类创建对象并使用这些类的实例。像你所展示的那些课程在他们被实例化之前并不是真的。
当您使用C
创建类$c = new C;
的实例时,生成的对象$c
将可以访问其继承的任何类的所有公共属性和受保护属性;在这种情况下A
和B
。这些属性可以在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
}
}