如何从class C访问父类的父类A的$varA?值同步与传递问题咨询
关于PHP类继承中访问父类的父类的问题解答
嘿,我来帮你把这几个问题掰明白,咱们结合代码例子来说更清楚:
1. 如何从Class C中访问父类的父类A的$varA?
这取决于A中$varA的访问修饰符:
- 如果
$varA是public或protected的:因为继承是传递性的,C继承B、B继承A,所以C的实例可以直接用$this->varA来访问,不需要额外操作。 - 如果
$varA是private的:private属性只能在定义它的类(也就是A)内部访问,这时候你需要在A中定义一个公共的getter方法,比如getVarA(),然后C通过$this->getVarA()来获取值。
举个代码例子:
class A { // 情况1:protected属性,可被子类继承访问 protected $varA = "Hello from A"; // 情况2:如果是private属性,需要getter // private $varA = "Hello from A"; // public function getVarA() { // return $this->varA; // } } class B extends A {} class C extends B { public function displayVarA() { // 情况1的调用方式 echo $this->varA; // 情况2的调用方式 // echo $this->getVarA(); } } $c = new C(); $c->displayVarA(); // 输出 "Hello from A"
2. 修改Class A中的值,该变更是否会在Class C中可见?
分两种情况讨论:
- 静态属性:静态属性属于类本身,而非单个实例。如果你修改了A的静态属性,那么所有继承A的类(包括B、C)的实例都会看到这个变更,因为它们共享同一个静态值。
- 非静态属性:非静态属性是每个实例独有的。如果你修改的是A某个实例的属性值,C的实例不会受到影响;但如果你直接修改A类定义中的默认属性值(比如编辑代码把
$varA的默认值改掉),那么之后新实例化的C会使用这个新的默认值,已经存在的C实例还是保持原来的值。
代码示例:
// 静态属性场景 class A { public static $staticVar = "Original static value"; } class B extends A {} class C extends B {} // 修改A的静态属性 A::$staticVar = "Updated static value"; $c = new C(); echo $c::$staticVar; // 输出 "Updated static value" // 非静态属性场景 class A { public $varA = "Original instance value"; } // 修改A的一个实例的属性 $aInstance = new A(); $aInstance->varA = "Changed value"; // 新实例化C,用的是类定义的默认值 $cInstance = new C(); echo $cInstance->varA; // 输出 "Original instance value"
3. 实例化Class C时,是否会将当时的所有值传递给新创建的类实例?
不会,准确来说:
- 每个新实例化的C,都会继承类定义链中的默认属性值,而不是继承某个已有A或B实例的修改值(静态属性除外,因为静态属性是类共享的)。
- 简单说,实例化的时候,新对象会根据类的定义(包括继承来的属性)初始化自己的属性副本,和其他已存在的实例没有关联,除非是静态属性这种类级别的共享值。
内容的提问来源于stack exchange,提问作者Patrick Rennings
相关产品推荐
相关产品推荐

