Переменная $parent_var является экземпляром класса ParentClass и хранит в себе name 'Parent'. Внутри класса есть функция что получит name по названию переменной. Внутри дочернего класса ChildClass Необходимо создать метод в котором нужно получить name переменной $parent_var, то есть воспользоваться функцией родительского класса что позволит его получить. Но у меня не выходит это сделать, ошибка 'Uncaught Error: Cannot access parent:: when current class scope has no parent' Как можно исправить? PHP: <?php class ParentClass { function __construct($wname){ $this -> name = $wname; } function GetName($fname) { global $$fname; return $$fname -> name; } } $parent_var = new ParentClass('Parent'); //echo $patent_name_1 -> GetName('parent_var'); // Обращение вне классов class ChildClass { function __construct($wname) { $this -> name = $wname; } function GetName($fname) { parent::GetName($fname); } } $child_var = new ChildClass('Child'); echo $child_var -> GetName('parent_var'); ?> Ей богу, попытался понятно изложить, но кажись вышло не очень. Надеюсь меня поймут :\
Упс.Специально этот код написал для топика, и забыл дописать extends ParentClass. И именно если это сделать, он работает хотя вопросом этой темы послужил другой не рабочий код с таким принципом. Короче случайно, получился рабочий вариант xD Ладно, стыд, позор, вопрос закрыт
Задача, однако, о чём-то вроде "Стратегии". Метод дочернего класса (или не дочернего, в общем-то) в качестве параметра получает объект определённого класса и посредством этого объекта вызывает нужный метод и возвращает результат. Ко всему прочему нужен интерфейс, который должен реализовывать "родительский" класс.
Возможно, нечто похожее на: https://onlinephp.io/c/dba4a Спойлер PHP: <?php interface NameGetter { function getSomeName(NameGetter $object); } class A implements NameGetter { private $someName; public function __construct(string $name) { $this->someName = $name; } public function getSomeName(NameGetter $object = null) { return $this->someName; } } class B extends A { public function getSomeName(NameGetter $object = null) { return isset($object) ? $object->getSomeName() : $this->someName; } } $foo = new A('Parent'); $boo = new B('MyName'); $someName = $boo->getSomeName($foo); var_dump($someName, $foo, $boo); --- Добавлено --- Возможно, в задании указан наследник, чтобы не упоминать про интерфейс
А за каким хреном метод класса лезет в глобальные переменные? Он должен вернуть то, что записано в экземпляре. Доступ к экземпляру внутри методов через $this. Если класс не использует собственные поля, он нафиг значит никому не нужен, и достаточно простой функции
А вот нужно, я недавно создал тему на этот вопрос https://php.ru/forum/threads/ne-rabotaet-kod-s-peremennymi-peremennyx.100308/ Иначе код работать не будет. Это нужно для самой функции
Логика неправильная. Вон ты устанавливаешь в конструкторе поле (кстати, необъявленные поля - это плохо, в php 8.2 их запретят), и вообще не используешь. --- Добавлено --- PHP: class ParentClass { protected $name; function __construct($wname){ $this -> name = $wname; } function GetName() { return $this->name; } } class ChildClass extends ParentClass { // Переопределять конструктор, который делает то же самое, никому не надо // Переопределим GetName, тоже добавив поведение, иначе - тоже нафиг не нужно, как и дочерний класс function GetName() { return parent::GetName() . " from child"; } } $parent_var=new ParentClass('Parent') $child_var = new ChildClass('Child'); echo $child_var->GetName(); Переменные переменных - это фича, которую нужно использовать только в крайнем случае. Они небезопасные, они хреново читаются, заставляют пересматривать другой код. Глобальные переменные - тоже избегаются всячески.
@Dasderdas, вариант упрощенный (теперь без интерфейса) и с исправленной логической ошибкой в определении свойства: песочница. С примером получения значения свойства не только от существующего объекта класса-родителя, но и собственного Спойлер PHP: <?php class A { protected $someName; public function __construct(string $name) { $this->someName = $name; } public function getSomeName(A $object = null) { return $this->someName; } } class B extends A { public function getSomeName(A $object = null) { return isset($object) ? $object->getSomeName() : $this->someName; } } $foo = new A('Parent'); $boo = new B('MyName'); $someName = $boo->getSomeName($foo); $someName2 = $boo->getSomeName(); var_dump($someName, $someName2, $foo, $boo); --- Добавлено --- @mkramer, написано, что нужно значение свойства уже существующего объекта класса-родителя:
@Dasderdas, уяснил я наконец-то, что в задании требуется PHP: class A { protected $someName; public function __construct(string $name) { $this->someName = $name; } public function getSomeName() { return $this->someName; } } class B extends A { public function getSomeName(A $object = null) { return isset($object) ? $object->getSomeName() : $this->someName; } } $foo = new A('Parent'); $boo = new B('MyName'); $someName = $boo->getSomeName($foo); $someName2 = $boo->getSomeName(); var_dump($someName, $someName2, $foo, $boo); От предыдущего варианта отличается объявлением метода getSomeName в родительском классе. Там не нужны параметры.
Код (Text): class A { protected static $name; public function __construct(string $name) { static::$name = $name; } public function getName() { return static::$name; } public function getParentName() { return self::$name; } } class B extends A { protected static $name; } $a = new A('Aaaaaa'); $b = new B('Bbbbbb'); echo $a->getName() . PHP_EOL; //Aaaaaa echo $b->getName() . PHP_EOL; //Bbbbbb echo $a->getParentName() . PHP_EOL; //Aaaaaa echo $b->getParentName() . PHP_EOL; //Aaaaaa
@Александр Петрович Очень мило... Инициализировать статическое поле в конструкторе, тем самым перезатерать его с каждым созданным экземпляром