Поскольку ваш код не компилируется, вот обновленный:
<?php
class A{
protected $x='I am the value of Class A';
public function getValueUsingAMethod() {
return $this->x;
}
}
class B extends A{
protected $x='I am the value Class B';
public function getValueUsingBMethod(){
return $this->x;
}
}
$anA = new A();
$aB = new B();
// Will output: B called - I am the value of Class A
echo '<br />B called - ' . $anA->getValueUsingAMethod();
// Will output: A called - I am the value Class B
echo '<br />A called - ' . $aB->getValueUsingAMethod();
// Will output: B called - I am the value Class B
echo '<br />B called - ' . $aB->getValueUsingBMethod();
// Outputs this
// object(B)#2 (1) { ["x":protected]=> string(22) "I am the value Class B" }
var_dump( $aB );
Посмотрите на вторую строку вывода. Вы вызываете метод класса A , и метод возвращает значение из экземпляра объекта класса B .
Если подкласс A с помощью класса B и B перезаписывает переменную в области видимости A, все методы A автоматически получают доступ к перезаписанным переменным, если они вызываются из экземпляра B.
Последняя строка вывода описывает внутреннюю структуру B. Как видите, доступна только одна переменная экземпляра x.
Почему?
Если перезаписать $ x, семантика будет такой: «Используйте мой новый $ x вместо оригинального $ x».
Если вам определенно необходим доступ к $ x, у вас может возникнуть желание создать переменную дополнительного члена с другим именем в B.