За последние 24 часа нас посетили 16137 программистов и 1666 роботов. Сейчас ищут 925 программистов ...

Доступ к полю суперкласса

Тема в разделе "PHP для новичков", создана пользователем Vad0k, 3 авг 2018.

  1. Vad0k

    Vad0k Активный пользователь

    С нами с:
    17 ноя 2014
    Сообщения:
    23
    Симпатии:
    0
    Код (Text):
    1. class Person{
    2.     public $sex = 'girl';
    3.     public $age = 0;
    4.     public $height = 150;
    5.     public static $numberPassport = 1;
    6.  
    7.     public function getParentSex(){
    8.        
    9.         echo $this->sex;
    10.     }
    11. }
    12.  
    13. class Boy extends Person{
    14.     public $hobby = ['girl', 'basketball', 'cars', 'alcohol'];
    15.     public $hasHair = false;
    16.     public $sex = 'man';
    17.  
    18.     public function getParentSex(){
    19.         echo $this->sex;
    20.         parent::getParentSex();
    21.  
    22.     }
    23. }
    24.  
    25. $boy = new Boy();
    26. $boy->getParentSex();
    При вызове выдает два раза manman
    Что необходимо сделать, чтобы вывело mangirl
    Почему через parent::getParentSex() вызывается дочерний метод подкласса?
     
  2. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    $this->sex . parent::getParentSex
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    В PHP, когда ты в подклассе переопределяешь поле со значением по умолчанию, вместо создания нового поля php перезаписывает то, что объявлено в супер-классе. Поэтому так не получится, как ты хочешь. А вот если ты поле заменишь на метод, то ты можешь вызывать родительский в перекрытом.
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Вызывается вовсе не дочерний метод. Вызывается именно метод родителя
    Вот только выводится значение свойства, объявленного как public. А оно (public-свойство), как выше указали, переопределяется в дочернем классе.
    Можете, например, объявить это свойство как private. Тогда оно не будет переопределяться.
    Но это тоже не выход для предложенной схемы... ибо станно смотрится "мальчик", наследующий класс "девочки" (ведь именно таким образом определен "person"). :cool:
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Говорят, в утробе все мы девочки по-началу :)