За последние 24 часа нас посетили 55142 программиста и 1781 робот. Сейчас ищут 1932 программиста ...

аномалия наследования

Тема в разделе "PHP для новичков", создана пользователем yurri_87, 10 окт 2017.

Метки:
  1. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    Код (Text):
    1. class Roditel {
    2.      function sayHello(){
    3.          print "Привет!";
    4.      }
    5. }
    6.  
    7. class Rebenok extends Roditel{
    8.       static public function sayHello(){
    9.           print "(Child) Привет!";
    10.       }
    11.       public function sayPrivet(){
    12.           parent::sayHello();
    13.       }
    14. }
    15.  
    16. $child = new Rebenok();
    17. $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):
    1. parent::sayHello()
    обращается к методу РОДИТЕЛЯ.

    Прошу хотябы направить меня на путь истинный. Но если разжуете - я по-человеческому благодарен.

    Мне не кажется, что это вопрос из-за незнания элементарных основ, ведь как работают модификаторы доступа я вполне понимаю.
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    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
     
    [vs] и Abyss нравится это.
  3. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Там до вызова дела не доходит
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Бро, английский надо подтягивать, однако. Тяжко это читать было.
     
  5. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    то что метод не является статичным - неважно. Ведь с помощью
    Код (Text):
    1. parent::
    можно вызывать и нестатичные методы. Я все равно не понял почему ошибка.
    и почему он мне пишет что невозможно сделать нестатичный метод Roditel::sayHello() статичным в классе Rebenok ?
    Почему php пытался "сделать" метод а не "вызвать" его. Кто-нибудь просто объясните мне правило которое у php не выполнилось.
    Я как бы обычный неглупый человек и если мне объяснить - я пойму. А то что ты английский знаешь - ну хорошо. Однако объяснить ты не смог ни на английском ни на русском доходчиво.
     
    #5 yurri_87, 11 окт 2017
    Последнее редактирование: 11 окт 2017
  6. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    Какой именно метод не является статичным? Rebenok::sayHello()? но ведь я к нему и не обращался!
    Просто я хочу понять какой именно принцип был нарушен, что появилась такая ошибка.
     
    #6 yurri_87, 11 окт 2017
    Последнее редактирование: 11 окт 2017
  7. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Пожалуй, стоит повторить.
     
  8. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    Почему? сорян что туплю. Но почему дело не доходит до вызова?
    Я пытаюсь понять, какой принцип php был нарушен.

    правильно ли я понимаю что в классе не может быть 2 метода с одним названием один статичный другой нет? Но почему тогда PHP не напишет об этом?

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

    Вот я - мужик, ты - мужик, объясни мне на пальцах пожалуйста. "в пхп есть такое-то правило. Вот ты написал вот это, пхп смотрит вот это и по описанному правилу пытается сделать вот это, однако правило не срабатывает, потому что так-то". Вот и все.
     
    #8 yurri_87, 11 окт 2017
    Последнее редактирование: 11 окт 2017
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Нельзя при наследование не статичный метод сделать статичным (Cannot make non static method Roditel::sayHello() static in class Rebenok)

    PHP:
    1. <?php
    2.  
    3. class FooParent {
    4.  
    5.     public function bar()
    6.     {
    7.  
    8.     }
    9.  
    10. }
    11.  
    12. class FooChild extends FooParent {
    13.  
    14.     public static function bar()
    15.     {
    16.  
    17.     }
    18. }
    19.  
    20. $foo = new FooChild();
    21. //Fatal error: Cannot make non static method FooParent::bar() static in class FooChild in index.php on line 18
     
    yurri_87 нравится это.
  10. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    Все, дошел. Действительно тупил, спасибо огромное, респект! Просто я не понимал, что php пытается переопределить метод.
    Не думал что два одноименных метода не могут существовать имея разные контексты доступа, поэтому из формулировки ошибки небыло понятно что происходит попытка переопределить метод.
     
    #10 yurri_87, 11 окт 2017
    Последнее редактирование: 11 окт 2017