PHP и наследование с закрытыми / открытыми переменными - PullRequest
2 голосов
/ 20 августа 2010

У меня есть вопрос о том, как отображается вывод.

<?php

class Base
{
    private $privattrib = "Private Attribute1";

    function GetAttrib()
    {
        echo $this->privattrib;
    }
}

class Derived extends Base
{
    private $privattrib = "bute";
    function GetAttrib()
    {
        parent::GetAttrib();    
    }
}

$b = new Base();
$d = new Derived();
$d->GetAttrib();

?>

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

  1. Когда я вызываю parent :: GetAttrib (), становится ли значение $ this (в методе GetAttrib () Base) объектом Base или все еще является производным объектом?

  2. Выход «Private Attribute1». Если $ this относится к производному объекту, разве отображение не должно быть «bute», так как закрытый атрибут переопределяется в базовом классе?

  3. Если я изменю оба privaattrib на public, вывод будет "bute". Почему это?

Ответы [ 2 ]

0 голосов
/ 20 августа 2010

Обратите внимание, что использование переопределенной версии вызова GetAttrib в базовой версии не очень полезно;оставив его неопределенным в Base, вы получите тот же результат.

  1. Имеет смысл думать о нем как об объекте типа Base, так как вы не можете вызывать любые функции, которые определены тольков Derived, и если private, то переменные-члены определены в обоих, он будет использовать переменные из Base.

  2. Нет;поскольку $ privattrib является приватным, версия Base и версия Derived полностью независимы.

  3. Если вы сделаете член $ privattrib общедоступным, строка

    public $ privattrib = "bute";

является переопределением $ privattrib, а не объявлением нового независимого переменной.

0 голосов
/ 20 августа 2010

Кажется, что когда вы объявляете свойство как частное, оно не может быть переопределено производным классом. Если вы объявите его как общедоступный, он может быть переопределен и напрямую доступен для другого кода. Я думаю, что защищенный означает, что он может быть переопределен, но не доступен извне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...