За последние 24 часа нас посетили 20709 программистов и 1715 роботов. Сейчас ищут 1378 программистов ...

Наследование классов, переопределение метода.

Тема в разделе "PHP для профи", создана пользователем jasper, 7 апр 2018.

  1. jasper

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

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    Есть 3 класса:

    class A{
    static function getData(){
    return B::getData();
    }
    }

    class B{
    static function getData(){
    return C::getData();
    }
    }

    class C{
    static function getData(){
    return 555;
    }
    }

    Мне нужно изменить так, что бы в итоге возвращалось не 555, например 444. Это получается мне нужно наследовать обязательно все 3 класса и переопределять каждый метод?
     
  2. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Ну они у вас не наследуются. А так, да. Но можно перейти на темную сторону.
     
  3. jasper

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

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    Ну я не стал просто это писать, но напишу:
    class A_my extends A{
    static function getData(){
    return B_my::getData();
    }
    }

    class B_my extends B{
    static function getData(){
    return C_my::getData();
    }
    }

    class C_my extends C{
    static function getData(){
    return 444;
    }
    }

    Получается что бы вернуть значение 444 нужно изменить всего лишь один метод C::getData(), но что бы до него добраться нужно наследовать все классы по цепочке, я думал может есть проще вариант?
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Мы ведь в теме для профи? Тогда для начала нужно понять, с какого перепугу у нас тут везде статика. Она конечно имеет право на существование, но я с трудом представляю таски, где всё это нельзя заменить нормальным DI с контейнером.
     
  5. jasper

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

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    Ну я все упростил до безобразия, что бы проще понять, на самом деле это ядро битрикса. Не хочется кучу классов наследовать что бы добраться до 1 метода в котором мне нужно изменить данные. Думал может проще есть метод.

    Поставлю вопрос по другому, если взять пример из 1 поста и вызвать A::getData(); получим 555, как можно сделать так что бы методом C::getData(); я мог вернуть 444, но обязательно нужно прогнать результат через методы getData() классов B и A, в них происходит важная обработка данных?
     
    #5 jasper, 7 апр 2018
    Последнее редактирование: 7 апр 2018
  6. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    @jasper я вам ответил, в чем проблема ?
     
  7. jasper

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

    С нами с:
    21 фев 2009
    Сообщения:
    45
    Симпатии:
    0
    Если, А так, да, понимать, что по другому никак, то ок, спасибо.