Помогите разобраться. Есть задача. Создан класс First со свойством $number. И создан класс-наследник в котором это свойство переопределено и ему загружены другие данные. Вопрос. Как получить значение свойства родителя в объекте наследника, если в его классе в этой переменной перезаписаны другие данные? Другими словами, как не меняя свойств и методы ни родителя ни наследника - в вызове метода getNumber() получить сообщение - "First" ? Код (Text): class First { protected $number = "First"; protected function getNumber() { return $this->number; } } class Second extends First { protected $number = "Second"; } $first = new First; $second = new Second; // здесь нужно вывести "First" echo $second->getNumber(); Долбусь с этим уже второй день... перепробовал всё что знал. Буду благодарен за любые идеи по этому поводу.
Re: как получить значение свойства родителя в классе наследн статические свойства и методы использовать?
Re: как получить значение свойства родителя в классе наследн Возможно я чет не так использовал, но у меня со статическими то же ничего не вышло. Ведь менять существующие методы и свойства нельзя. Если у вас есть ответ - просветите пожалуйста. Добавлено спустя 6 минут 31 секунду: Re: как получить значение свойства родителя в классе наследнике? Со статикой я пытался вот так решить... Код (Text): class First { protected $number = "First"; protected function getNumber() { return $this->number; } public static function fooNumber() { return self::$number; } } class Second extends First { protected $number = "Second"; public static function getNumber() { return self::fooNumber(); } } $first = new First; $second = new Second; // здесь нужно вывести "First" echo $second->getNumber(); И ничего не вышло...
Re: как получить значение свойства родителя в классе наследн недостаточно статики. больше статики, больше.
Можно в родительский класс добавить свой публичный метод php.net/manual/ru/function.runkit-method-add.php Код (PHP): <?php class First { private $number = "First"; protected function getNumber() { return $this->number; } } class Second extends First { protected $number = "Second"; public function getNumber() { return parent::getNumber(); } } //$first = new First; $second = new Second; // здесь нужно вывести "First" echo $second->getNumber(); ?>
Re: как получить значение свойства родителя в классе наследн На сколько я понял из материала по ссылке, то это не решает задачу. runkit_method_add добавляет метод в класс... но я это могу делать и без этого. Я могу добавлять в родительский класс любые методы, я не могу лишь менять свойства и методы, которые уже существуют. В вашем коде не создан объект First и вы изменили свойство на приват... оно должно быть протектед
Re: как получить значение свойства родителя в классе наследн Я вам код показал, что если protected заменить на private для First $number, то получите значение из First
Re: как получить значение свойства родителя в классе наследн да, я его сначала не увидел. Дело в том что менять свойства нельзя. Этот пример я вырвал из большого куска и там все завязано на эти свойства, так что их менять нельзя. Добавлено спустя 2 минуты 15 секунд: Re: как получить значение свойства родителя в классе наследнике? Как Ganzal, посмеявшись над моими глюками - я всё же думаю что он прав и нужно рыть в сторону применения статических свойств и методов.
Re: как получить значение свойства родителя в классе наследн это был не сарказм. вы просто бросили на половине пути. Код (Text): class First { protected static $number = "First"; protected function getNumber() { return self::$number; } } class Second extends First { protected static $number = "Second"; public function getNumber() { return static::$number . '++' . parent::getNumber(); // or return static::$number . '++' . parent::$number; } } $first = new First; $second = new Second; var_dump($second->getNumber()); // string(13) "Second++First" во втором классе метод публичный ибо иначе как вы догадываетесь не будет работать внутри конструкции var_dump(). можно вызывать родительский метод или напрямую читать родительское свойство. честно говоря я не понимаю вашей задачи до конца, но надеюсь это один из вариантов её решения.
Re: как получить значение свойства родителя в классе наследн я извиняюсь что ввел в заблуждение... Просто за день ковыряния, я уже тыщу раз переписал этот код, разными вариантами в том числе и статикой. То что я накидал на скорую руку и выложил здесь как вариант со статикой - это лишь общее направление моей идеи которую я пробовал реализовать на статике... я подумал что для знатоков и так будет понятно. (ещё раз извиняюсь) Ваш вариант не подходит, по тому что существующие свойства и методы менять нельзя, а вы поменяли их на статические. Я специально упростил кусок кода и выдернул проблемное место не вываливая сюда всю портянку классов. Задача стоит предельно простая: в классе "Первый" есть свойство "номер", а в классе-наследнике "Втором" это свойство переопределено. Я создаю два объекта (они оба нужны). Но вто "Втором" объекте нужно иметь возможность получить доступ к свойству "номер" родительского класса путем вызова родительского метода "getNumber()". В результате долны получить сообщение - "First". Менять эти свойства и методы нельзя, можно лишь дописать что то ещё к этому. Добавлено спустя 51 минуту 10 секунд: Re: как получить значение свойства родителя в классе наследнике? Ещё один мой кривой вариант со статическими свойствами... Не могу никак придумать, как нестатическую переменную родителя запихнуть в сатитческий метод... Код (Text): class First { protected $number = "First"; protected function getNumber() { return $this->number; } protected static function fooNumber() { return self::$number; } } class Second extends First { protected $number = "Second"; public function getName() { return parent::fooNumber(); } } $first = new First; $second = new Second; // здесь нужно вывести "First" echo $second->getNumber(); Добавлено спустя 22 минуты 32 секунды: Re: как получить значение свойства родителя в классе наследнике? Всё, решение найдено. Если вдруг кому будет нужно... вот оно Код (Text): class First { protected $number = "First"; protected function getNumber() { return $this->number; } } class Second extends First { protected $number = "Second"; public function getNumber() { $parent = new First; return $parent->getNumber(); } } $first = new First; $second = new Second; // выводим "First" echo $second->getNumber(); Всем спасибо за идеи. Часто очень не хватает свежего взгляда или мысли.
Re: как получить значение свойства родителя в классе наследн Чего? не нравится? А мне нравится, решение довольно изящное и главное - "правильное"!