За последние 24 часа нас посетили 8980 программистов и 172 робота. Сейчас ищут 148 программистов ...

Как получить свойство наследуемого класса?

Тема в разделе "PHP для новичков", создана пользователем SpikePHP, 15 май 2019.

  1. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    113
    Симпатии:
    22
    Пример :
    PHP:
    1. class A{
    2.   public $x = 1;
    3.   protected $y  = 2;
    4.   private $z = 3;
    5. }
    6.  
    7. class B extends A {
    8.     protected $y = 22;
    9.   function getParentY(){ return parent::y;}
    10. }
    11.  
    12.  
    13. $b = new B;
    14.  
    15. echo $b->getParentY();// приводит к ошибке ниже:


    FATAL ERROR Uncaught Error: Undefined class constant 'y' in /home4/phptest/public_html/code.php70(5) : eval()'d code:9 Stack trace: #0 /home4/phptest/public_html/code.php70(5) : eval()'d code(15): B->getParentY() #1 /home4/phptest/public_html/code.php70(5): eval() #2 {main} thrown on line number 9

    Как же получить родительское свойство?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    5.249
    Симпатии:
    863
    Адрес:
    Лень
    Прочитать ошибку и изучить static
     
  3. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    424
    Адрес:
    РД, г. Махачкала.
    PHP:
    1. class A {
    2.  
    3.     private $x = 1;
    4.     private $y = 3;
    5.  
    6.     public function getY() {
    7.         return $this->y;
    8.     }
    9.  
    10. }
    11.  
    12. class B extends A {
    13.  
    14.     private $y = 33;
    15.  
    16.     public function getY() {
    17.         $parentY = parent::getY();
    18.         var_dump($parentY, $this->y);
    19.         return $this->y;
    20.     }
    21.  
    22. }
    23.  
    24. $b = new B();
    25. $b->getY();
     
    TeslaFeo и SpikePHP нравится это.
  4. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    113
    Симпатии:
    22
    @mahmuzar Напрямую значит нельзя? Меня интересует, можно ли в принципе напрямую при данной ситуации вызвать
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    6.521
    Симпатии:
    1.226
    @SpikePHP Если ты перекрыл protected или public свойство, то вообще никак нельзя получить исходное. Даже методы базового класса будут видеть твоё перекрытое. А с приватными можно, как показал @mahmuzar
     
    SpikePHP нравится это.
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    424
    Адрес:
    РД, г. Махачкала.
    @SpikePHP, объяви его как статик. А на примере выше ты пытаешься обратиться к константе, которой нету.

    т.е.:
    PHP:
    1. protected  static $y  = 2;
    и обращаться так:
    PHP:
    1. parent::$y
    А для чего тебе это понадобилось?
     
  7. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    113
    Симпатии:
    22
    Да вот вспоминаю пыху и по старым конспектам прошелся. И там было, что можно вызвать родительский метод. А про свойства ничего. Вот и заинтересовало
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.314
    Симпатии:
    540
    PHP:
    1. class A{
    2.   public $x = 1;
    3.   protected $y  = 2;
    4.   private $z = 3;
    5.  
    6.     function getY() { return (new self)->y; }
    7. }
    8. class B extends A {
    9.     protected $y = 22;
    10.   function getParentY(){ return parent::getY();}
    11. }
    12. $b = new B;
    13. echo $b->getParentY();
    на телефоне набирал
     
    SpikePHP нравится это.
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    6.521
    Симпатии:
    1.226
    @[vs] Хитрый :D
     
  10. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.691
    Симпатии:
    609
    PHP:
    1. <?php
    2.  
    3. class Foo
    4. {
    5.  
    6.     private $baz = 'bar';
    7.  
    8. }
    9.  
    10. class Bar extends Foo
    11. {
    12.  
    13.     public function getBaz(): array
    14.     {
    15.         $results = [];
    16.         $baz = (new ReflectionObject($this))->getParentClass()->getProperty('baz');
    17.         $baz->setAccessible(true);
    18.         $results[] = $baz->getValue($this);
    19.         $baz->setValue($this, 'BAZ');
    20.         $results[] = $baz->getValue($this);
    21.         $baz->setAccessible(false);
    22.  
    23.         return $results;
    24.     }
    25.  
    26. }
    27.  
    28. var_dump((new Bar())->getBaz());
    [​IMG]
     
    SpikePHP нравится это.
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    6.521
    Симпатии:
    1.226
    Рефлексия - читерство своего рода :)
     
    SpikePHP нравится это.
  12. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.691
    Симпатии:
    609
    Ну, рефлексию придумали для тестов и фреймворков. Если она используется в бизнес-логике, то явно что-то пошло не так )
     
    SpikePHP нравится это.