Как гарантировать наличие метода в наследнике без привязки к аргументам?

Есть базовый класс MyBase. Моя цель гарантировать, что в каждом наследнике будет объявлен метод myMethod, но мне нужна свобода в объявлении аргументов.
Т.е. мне нужно примерно следующее
abstract class MyBase
{
    abstract public function myMethod();
}

class Foo extends MyBase
{

    public function myMethod(string $s)
    {
        //
    }
}

Но, по понятным причинам, в таком виде я сделать этого не могу.
Проблему могу решить, убрав вообще абстрактный метод myMethod в классе MyBase. Но таким образом я лишь обхожу проблему, а не решаю ее.
Можно ли сделать это "правильно"? Или вообще такой подход некорректен и по-хорошему надо делать как-то иначе?

Конкретный пример: класс для некой задачи (например достать данные из бд, преобразовать некоторые данные и т.д.), у который есть метод run; базовый класс реализует внутренние процессы (например логгирование в бд, вывод инфы в консоль, запуск хуков и т.д.) и запуск метода run; каждая конкретная задача может принимать аргументы для своего исполнения => аргументы хочется принимать именно в методе run с проверкой типов.
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
glaphire
@glaphire Куратор тега PHP
PHP developer
Перегрузки методов в php нет. Лучше продумать правильно архитектуру, чтобы набор аргументов был стабильным на уровне абстрактного класса/интерфейса, чем передавать методу переменное количество аргументов и искать потом причины багов и повод для рефакторинга. Также переменное количество аргументов дает соблазн давать методу лишние полномочия, размазывая его первоначальное предназначение.
На уровне конструктора класса можно через dependency injection передать классы для логгирования, вывода инфы в консоль, тогда в методе run их не нужно передавать, но можно использовать внутри метода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@oxidmod
Используйте DTO для упаковки параметров в один аргумент или просто массив параметров, как любит делать Yii
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы