доступ к переопределенной защищенной переменной из родительского класса в PHP - PullRequest
2 голосов
/ 17 апреля 2011

Привет
Как я могу получить доступ к переопределенной защищенной переменной из родительского класса, вызвав ее метод получения в дочернем классе?

, например:

class A{
    protected x='test';
    protected function printx(){
        echo $this->x;
    }
}

class B extends A{
    protected x='test2';

    public function printxs(){
        parent::printx();
        echo "\n";
        echo $this->x;
    }
}

$b=new B;
$b->printsx();

Я ожидаю, что эта печать:

test
test2

но это печатает:

test
test

Ответы [ 3 ]

3 голосов
/ 17 апреля 2011

Во-первых, он не печатает test\ntest, он печатает test2\ntest2.

Когда вы создаете подкласс суперкласса, вы специализируете суперкласс.В нашем примере мы специализируем класс A с классом B.Благодаря этой специализации мы переопределяем значение переменной защищенного объекта $this->x.

Когда вы вызываете метод суперкласса printx(), нас просят повторить значение $this->x, которое было переопределено внаш подкласс должен быть test2, а не test.

Вот код PHPified:

<?php

class A {
    protected $x = 'test';
    protected function printx(){
        echo $this->x;
    }
}

class B extends A {
    protected $x = 'test2';

    public function printsx(){
        parent::printx();
        echo "\n";
        echo $this->x;
    }
}

$b=new B;
$b->printsx();
2 голосов
/ 17 апреля 2011

Здесь нет такого понятия, как «родитель», здесь есть только одно свойство - один слот памяти для него.

Даже если это свойство впервые определено в родительском объектеclass, а затем переопределяется в дочернем классе, если вы работаете со свойством объекта ($this, здесь) , это всегда одно и то же свойство.

1 голос
/ 17 апреля 2011

Поскольку ваш код не компилируется, вот обновленный:

<?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.

...