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

Я использую стабильную версию 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 атрибут определяется "общественность", которую он не дает ошибке. PHP имеет собственные правила OO???

Спасибо

Править: Теперь все вещи ясны. На самом деле я думал в "наследовании", новый класс создается и наследовал всех участников, независимых от его предка. Я не знал правил "доступа", и правила наследования являются тем же.

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

class Foo
{
    private $bar = "baz";

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

class Bar extends Foo
{}

$o = new Bar;
echo $o->getBar();      //baz
6
задан jsonx 19 January 2010 в 00:59
поделиться

3 ответа

Класс XPathExpression предоставляет метод AddSort:

http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathexpression.aspx

-121--3894561-

Это строка-правонарушение:

class C<out T> 

Как указано в сообщении об ошибке, нельзя применять универсальную дисперсию к классам, только к интерфейсам и делегатам. Это будет нормально:

interface C<out T>

Это не так.

Для получения подробной информации см. Создание вариантов универсальных интерфейсов

-121--4213580-

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

3
ответ дан 8 December 2019 в 14:43
поделиться

Из Руководства PHP :

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

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 () был определен или перегружен в бар , это не будет работать. См. http://codepad.org/rlswx7sq

12
ответ дан 8 December 2019 в 14:43
поделиться

Частные Методы и переменные не могут быть доступны доходными классами или внешне - только самим классом. Использование защищено Если вы хотите переменную доступную для ребенка, но недоступен для внешних классов.

1
ответ дан 8 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: