Php Наследование - PullRequest
       15

Php Наследование

6 голосов
/ 11 января 2010

Я использую стабильный релиз PHP 5.3 и иногда сталкиваюсь с очень противоречивым поведением. Насколько я знаю, в наследовании все атрибуты и методы (частные, публичные и защищенные) в суперклассе передаются дочернему классу.

class Foo
{
    private $_name = "foo";
}
class Bar extends Foo
{
    public function getName()
    {
        return $this->_name;
    }
}
$o = new Bar();
echo $o->getName();

//Notice: Undefined property: Bar::$_name in ...\test.php on line 11

Но когда атрибут Foo :: $ _ name определен как public, он не выдает ошибку. PHP имеет собственные правила OO ???

Спасибо

Редактировать: Теперь все ясно. На самом деле я думал, что в «наследовании» создается новый класс, который наследует всех членов независимо от его предка. Я не знал, что правила «доступа» и правила наследования одинаковы.

Редактировать Согласно вашим комментариям этот фрагмент должен дать ошибку. Но это работает.

class Foo
{
    private $bar = "baz";

    public function getBar()
    {
        return $this->bar;
    }
}

class Bar extends Foo
{}

$o = new Bar;
echo $o->getBar();      //baz

Ответы [ 3 ]

12 голосов
/ 11 января 2010

С Руководство по PHP :

Видимость свойства или метода может быть определен с помощью префикса декларация с ключевыми словами public, protected или private. Члены класса заявлено public можно получить доступ везде. Члены объявлены protected могут быть доступны только внутри класса сам и по наследству и родителю классы. Члены объявлены как private может быть доступен только классу, который определяет член.

class A
{
    public $prop1;     // accessible from everywhere
    protected $prop2;  // accessible in this and child class
    private $prop3;    // accessible only in this class
}

И нет, это не отличается от других языков, использующих те же ключевые слова.

Относительно вашего второго редактирования и фрагмента кода:

Нет, это не должно выдавать ошибку, поскольку getBar() наследуется от Foo, а Foo имеет видимость до $bar. Если getBar() был определен или перегружен в Bar, он не будет работать. См http://codepad.org/rlSWx7SQ

3 голосов
/ 11 января 2010

Ваши предположения не верны. Защищенные и публичные члены «передаются». Частные участники не являются. Насколько мне известно, это типично для многих языков ООП.

1 голос
/ 11 января 2010

Закрытые методы и переменные не могут быть доступны дочерним классам или извне - только самому классу. Используйте Protected , если вы хотите, чтобы переменная была доступна дочернему элементу, но недоступна внешним классам.

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