За последние 24 часа нас посетили 17638 программистов и 1723 робота. Сейчас ищут 909 программистов ...

как получить значение свойства родителя в классе наследнике?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Гарин, 15 ноя 2014.

  1. Гарин

    Гарин Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    7
    Симпатии:
    0
    Помогите разобраться.

    Есть задача. Создан класс First со свойством $number. И создан класс-наследник в котором это свойство переопределено и ему загружены другие данные.

    Вопрос.
    Как получить значение свойства родителя в объекте наследника, если в его классе в этой переменной перезаписаны другие данные?

    Другими словами, как не меняя свойств и методы ни родителя ни наследника - в вызове метода getNumber() получить сообщение - "First" ?

    Код (Text):
    1.  
    2. class First {
    3.  
    4.         protected $number = "First";
    5.        
    6.         protected function getNumber() {
    7.            
    8.             return $this->number;
    9.  
    10.         }
    11.  
    12.     }
    13.  
    14.     class Second extends First {
    15.  
    16.         protected $number = "Second";
    17.  
    18.     }
    19.    
    20.     $first = new First;
    21.    
    22.     $second = new Second;
    23.  
    24.     // здесь нужно вывести "First"
    25.     echo $second->getNumber();
    Долбусь с этим уже второй день... перепробовал всё что знал.

    Буду благодарен за любые идеи по этому поводу.
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: как получить значение свойства родителя в классе наследн

    статические свойства и методы использовать?
     
  3. Гарин

    Гарин Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    7
    Симпатии:
    0
    Re: как получить значение свойства родителя в классе наследн

    Возможно я чет не так использовал, но у меня со статическими то же ничего не вышло. Ведь менять существующие методы и свойства нельзя.

    Если у вас есть ответ - просветите пожалуйста. :)

    Добавлено спустя 6 минут 31 секунду:
    Re: как получить значение свойства родителя в классе наследнике?
    Со статикой я пытался вот так решить...

    Код (Text):
    1.  
    2. class First {
    3.  
    4.   protected $number = "First";
    5.  
    6.   protected function getNumber() {
    7.      
    8.      return $this->number;
    9.  
    10.   }
    11.  
    12.   public static function fooNumber() {
    13.      
    14.      return self::$number;
    15.  
    16.   }
    17.  
    18. }
    19.  
    20. class Second extends First {
    21.  
    22.   protected $number = "Second";
    23.  
    24.   public static function getNumber() {
    25.      
    26.      return self::fooNumber();
    27.  
    28.   }
    29.  
    30. }
    31.  
    32. $first = new First;
    33.  
    34. $second = new Second;
    35.  
    36. // здесь нужно вывести "First"
    37. echo $second->getNumber();
    И ничего не вышло...
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: как получить значение свойства родителя в классе наследн

    недостаточно статики. больше статики, больше.
     
  5. Гарин

    Гарин Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    7
    Симпатии:
    0
    Re: как получить значение свойства родителя в классе наследн

    Вы можете помочь?
     
  6. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Можно в родительский класс добавить свой публичный метод php.net/manual/ru/function.runkit-method-add.php

    Код (PHP):
    1. <?php
    2. class First {
    3.  
    4.       private $number = "First";
    5.       
    6.       protected function getNumber() {
    7.          
    8.          return $this->number;
    9.  
    10.       }
    11.  
    12.    }
    13.  
    14.    class Second extends First {
    15.  
    16.       protected $number = "Second";
    17.  
    18.       public function getNumber()
    19.       {
    20.           return parent::getNumber();
    21.       }
    22.  
    23.    }
    24.    
    25.    //$first = new First;
    26.    
    27.    $second = new Second;
    28.  
    29.    // здесь нужно вывести "First"
    30.    echo $second->getNumber();
    31. ?>
     
  7. Гарин

    Гарин Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    7
    Симпатии:
    0
    Re: как получить значение свойства родителя в классе наследн

    На сколько я понял из материала по ссылке, то это не решает задачу. runkit_method_add добавляет метод в класс... но я это могу делать и без этого.
    Я могу добавлять в родительский класс любые методы, я не могу лишь менять свойства и методы, которые уже существуют.

    В вашем коде не создан объект First и вы изменили свойство на приват... оно должно быть протектед
     
  8. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Re: как получить значение свойства родителя в классе наследн

    Я вам код показал, что если protected заменить на private для First $number, то получите значение из First
     
  9. Гарин

    Гарин Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    7
    Симпатии:
    0
    Re: как получить значение свойства родителя в классе наследн

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

    Добавлено спустя 2 минуты 15 секунд:
    Re: как получить значение свойства родителя в классе наследнике?
    Как Ganzal, посмеявшись над моими глюками - я всё же думаю что он прав и нужно рыть в сторону применения статических свойств и методов.
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: как получить значение свойства родителя в классе наследн

    это был не сарказм. вы просто бросили на половине пути.
    Код (Text):
    1. class First {
    2.     protected static $number = "First";
    3.     protected function getNumber() {
    4.         return self::$number;
    5.     }
    6. }
    7.  
    8. class Second extends First {
    9.     protected static $number = "Second";
    10.     public function getNumber() {
    11.         return static::$number . '++' . parent::getNumber();
    12. // or
    13.         return static::$number . '++' . parent::$number;
    14.     }
    15. }
    16.  
    17. $first = new First;
    18. $second = new Second;
    19.  
    20. var_dump($second->getNumber()); // string(13) "Second++First"
    во втором классе метод публичный ибо иначе как вы догадываетесь не будет работать внутри конструкции var_dump(). можно вызывать родительский метод или напрямую читать родительское свойство.

    честно говоря я не понимаю вашей задачи до конца, но надеюсь это один из вариантов её решения.
     
  11. Гарин

    Гарин Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    7
    Симпатии:
    0
    Re: как получить значение свойства родителя в классе наследн

    я извиняюсь что ввел в заблуждение... Просто за день ковыряния, я уже тыщу раз переписал этот код, разными вариантами в том числе и статикой. То что я накидал на скорую руку и выложил здесь как вариант со статикой - это лишь общее направление моей идеи которую я пробовал реализовать на статике... я подумал что для знатоков и так будет понятно. (ещё раз извиняюсь)

    Ваш вариант не подходит, по тому что существующие свойства и методы менять нельзя, а вы поменяли их на статические.

    Я специально упростил кусок кода и выдернул проблемное место не вываливая сюда всю портянку классов.

    Задача стоит предельно простая: в классе "Первый" есть свойство "номер", а в классе-наследнике "Втором" это свойство переопределено. Я создаю два объекта (они оба нужны). Но вто "Втором" объекте нужно иметь возможность получить доступ к свойству "номер" родительского класса путем вызова родительского метода "getNumber()". В результате долны получить сообщение - "First".

    Менять эти свойства и методы нельзя, можно лишь дописать что то ещё к этому.

    Добавлено спустя 51 минуту 10 секунд:
    Re: как получить значение свойства родителя в классе наследнике?
    Ещё один мой кривой вариант со статическими свойствами...

    Не могу никак придумать, как нестатическую переменную родителя запихнуть в сатитческий метод...

    Код (Text):
    1.  
    2.  
    3. class First {
    4.  
    5.     protected $number = "First";
    6.  
    7.     protected function getNumber() {
    8.      
    9.      return $this->number;
    10.  
    11.     }
    12.  
    13.     protected static function fooNumber() {
    14.  
    15.         return self::$number;
    16.  
    17.     }
    18.  
    19. }
    20.  
    21. class Second extends First {
    22.  
    23.     protected $number = "Second";
    24.  
    25.     public function getName() {
    26.        
    27.         return parent::fooNumber();
    28.  
    29.     }
    30.  
    31. }
    32.  
    33. $first = new First;
    34.  
    35. $second = new Second;
    36.  
    37. // здесь нужно вывести "First"
    38. echo $second->getNumber();
    Добавлено спустя 22 минуты 32 секунды:
    Re: как получить значение свойства родителя в классе наследнике?
    Всё, решение найдено. Если вдруг кому будет нужно... вот оно

    Код (Text):
    1.  
    2. class First {
    3.  
    4.     protected $number = "First";
    5.  
    6.     protected function getNumber() {
    7.  
    8.         return $this->number;
    9.  
    10.     }
    11.  
    12. }
    13.  
    14. class Second extends First {
    15.  
    16.     protected $number = "Second";
    17.  
    18.     public function getNumber() {
    19.  
    20.         $parent = new First;
    21.  
    22.         return $parent->getNumber();
    23.  
    24.     }
    25.  
    26. }
    27.  
    28. $first = new First;
    29.  
    30. $second = new Second;
    31.  
    32. // выводим "First"
    33. echo $second->getNumber();
    Всем спасибо за идеи. Часто очень не хватает свежего взгляда или мысли.
     
  12. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Re: как получить значение свойства родителя в классе наследн

    Капец
     
  13. Гарин

    Гарин Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    7
    Симпатии:
    0
    Re: как получить значение свойства родителя в классе наследн

    Чего? не нравится?

    А мне нравится, решение довольно изящное и главное - "правильное"! ;)