Код (Text): class Roditel { function sayHello(){ print "Привет!"; } } class Rebenok extends Roditel{ static public function sayHello(){ print "(Child) Привет!"; } public function sayPrivet(){ parent::sayHello(); } } $child = new Rebenok(); $child->sayPrivet(); Если запустить этот код то выйдет ошибка Fatal error: Cannot make non static method Roditel::sayHello() static in class Rebenok. Непонятно, почему нестатичный метод Roditel::sayHello() не может быть вызван с помощью parent::sayHello(). Но, смотрите, если удалить в классе Rebenok метод "static public function sayHello()", то все заработает. Что за аномалия? Это непонятно, ведь Код (Text): parent::sayHello() обращается к методу РОДИТЕЛЯ. Прошу хотябы направить меня на путь истинный. Но если разжуете - я по-человеческому благодарен. Мне не кажется, что это вопрос из-за незнания элементарных основ, ведь как работают модификаторы доступа я вполне понимаю.
your method is not static. Carefully read the error on what it points out. There is always an answer there. And so you just spent time describing a mystical error, which they did not understand. It's easier to post, is not it? --- Добавлено --- + you have two methods that contradict each other, if not private ones. Therefore, you have anomalies
то что метод не является статичным - неважно. Ведь с помощью Код (Text): parent:: можно вызывать и нестатичные методы. Я все равно не понял почему ошибка. и почему он мне пишет что невозможно сделать нестатичный метод Roditel::sayHello() статичным в классе Rebenok ? Почему php пытался "сделать" метод а не "вызвать" его. Кто-нибудь просто объясните мне правило которое у php не выполнилось. Я как бы обычный неглупый человек и если мне объяснить - я пойму. А то что ты английский знаешь - ну хорошо. Однако объяснить ты не смог ни на английском ни на русском доходчиво.
Какой именно метод не является статичным? Rebenok::sayHello()? но ведь я к нему и не обращался! Просто я хочу понять какой именно принцип был нарушен, что появилась такая ошибка.
Почему? сорян что туплю. Но почему дело не доходит до вызова? Я пытаюсь понять, какой принцип php был нарушен. правильно ли я понимаю что в классе не может быть 2 метода с одним названием один статичный другой нет? Но почему тогда PHP не напишет об этом? я понимаю что тут подавляющее большинство не преподаватели. Но если бы я сам понимал причину, я бы легко объяснил другому на пальцах лаконично. Я понимаю что вопрос в матчасти. Но, скажем, я прочитал книжку Котерова, однако там принципа, объясняющего этот случай нету. Я ж гуглил, пытался найти ответ, остался последний вариант искать помощи на форуме. Вот я - мужик, ты - мужик, объясни мне на пальцах пожалуйста. "в пхп есть такое-то правило. Вот ты написал вот это, пхп смотрит вот это и по описанному правилу пытается сделать вот это, однако правило не срабатывает, потому что так-то". Вот и все.
Нельзя при наследование не статичный метод сделать статичным (Cannot make non static method Roditel::sayHello() static in class Rebenok) PHP: <?php class FooParent { public function bar() { } } class FooChild extends FooParent { public static function bar() { } } $foo = new FooChild(); //Fatal error: Cannot make non static method FooParent::bar() static in class FooChild in index.php on line 18
Все, дошел. Действительно тупил, спасибо огромное, респект! Просто я не понимал, что php пытается переопределить метод. Не думал что два одноименных метода не могут существовать имея разные контексты доступа, поэтому из формулировки ошибки небыло понятно что происходит попытка переопределить метод.