ФорумПрограммированиеPHP для идиотов → механизм наследования в ооп

механизм наследования в ооп

  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 2 апреля 2010 г. 23:09

    я всегда думал, что наследующий класс создает новый экземпляр родительского класса, причем вызывая его конструктор. но тут мои опыты показали, что оказывается наследник не вызывает конструктор родителя о_О
    вопросы:
    1) создает ли наследник новый экземпляр класса родителя?
    2) он не вызывает конструктор родителя?
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 2 апреля 2010 г. 23:12, спустя 3 минуты 1 секунду

    наследующий класс ничего не создат, какой нафиг экземпляр класса родителя?

    в PHP конструктор предка нужно вызывать напрямую (если нужно):
    parent::__constructor()
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 2 апреля 2010 г. 23:18, спустя 5 минут 34 секунды

    а как он тогда от родительского свойства и методы скопирует?
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 2 апреля 2010 г. 23:22, спустя 4 минуты 41 секунду

    не копирует а наследует
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 3 апреля 2010 г. 1:14, спустя 1 час 52 минуты 7 секунд

    soulgarden, короче, ботва выходит в том, что, по сути, он просто присоединяет родительские методы над своими. Можно грубо сказать - копирует из родительского класса к себе все методы, а также конструктор, но конструктор тут будет уже как бы отдельным методом (а не привычным нам "магическим" методом, который срабатывает при инициализации). Потому его (констуктор) и нужно будет в конструкторе уже нашего создаваемого класса вызвать (так, как указал Васяц).
    Я понимаю это дело таким макаром.
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 3 апреля 2010 г. 1:33, спустя 19 минут 3 секунды

    Есть класс раз - набор методов со своими именами
    Есть класс двас - набор методов со своими именами и ссылкой на "раз" как на предка

    Есть объект, назовём его "хуй", со своими свойствами и ссылкой на "двас", как на свой класс

    Вызывается метод method() - ищется "method" у в списке методов класса объекта.
    Не найден - идет дальше по цепочке классов-предков.

    Соответственно, когда метод с тем же именем в наследуемом классе перекрывает одноименный метода класса-предка, то хуй достучишься до того таким макаром.
    Если очень нужно, следует явно указать parent::

    С конструктором всё тоже, что и с обычными методами
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 3 апреля 2010 г. 6:37, спустя 5 часов 3 минуты 32 секунды

    васяц отлично всё объяснил. синтаксис parent::метод может сбить с толку — выглядит как обращение к статическому методу, а на самом деле происходит неявное использование $this

    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 3 апреля 2010 г. 18:17, спустя 11 часов 39 минут 33 секунды

    RTFM
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 3 апреля 2010 г. 18:48, спустя 31 минуту 40 секунд


    васяц отлично всё объяснил. синтаксис parent::метод может сбить с толку — выглядит как обращение к статическому методу, а на самом деле происходит неявное использование $this

    вообще то исторически :: - это операция доступа к области видимости. Это как раз ставит всё на свои места.
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 3 апреля 2010 г. 19:00, спустя 11 минут 42 секунды

    kostyl, ты наверное имел в виду области имен, а не области видимости. php срал на всё историческое. дяди подумали и решили, что в php неймспесы будут через "\"
    такие вещи нельзя понять, можно просто запоминать
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 3 апреля 2010 г. 19:13, спустя 12 минут 46 секунд

    artoodetoo, нет, я говорю, что ты как бы в :: вложил понятие статики, а я, как бы на основании исторических причин )) вложил доступ к области видимости, что нормально разрулило ситуацию с замеченным тобой явлением сбития с толку.

    int g;
    int main () {
    int g;
    g = 1;
    ::g = 2;
    return 0;
    }
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 3 апреля 2010 г. 21:01, спустя 1 час 48 минут 32 секунды

    kostyl, не пей.
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 3 апреля 2010 г. 22:11, спустя 1 час 9 минут 54 секунды


    kostyl, не пей.

    А медведь панда как бы всем своим видом говорит: "Не бухайте" (махая пальцем лапы так влево-вправо)
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 3 апреля 2010 г. 23:27, спустя 1 час 15 минут 29 секунд

    есть класс например ядро. и наследуюший его. ну роутер пусть. хочется чтобы роутер наследовал ядро для того чтобы содержать в себе основные классы. то есть ядро инстанцирует в себе лоадер, еще какую нибудь важную хрень. и надо чтоб наследующий его роутер наследовал и инстанцированные объекты этих классов. но фигушки. инстанцирование этих классов находится в конструкторе класса ядра. мы можем вручную parent::__construct() делать, но хочется чтоб оно наследовало само и не инстанцировало каждый раз а брало уже инстанцированную в лоадере ранее объект. то есть как бы чтоб роутер наследуя инстанцировал ядро. хуйню нагородил :), надеюсь поймете, возможно ли сделать что я хочу?
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 3 апреля 2010 г. 23:31, спустя 4 минуты 54 секунды

    не люблю я эти терки для высших умов: лоадер, роутер… траляля, как лучше… философия фреймворков… блаблабла
    https://smappi.org/ - платформа по созданию API на все случаи жизни

Пожалуйста, авторизуйтесь, чтобы написать комментарий!