Есть ли в PHP перегрузка методов?

«Есть ли в PHP перегрузка методов?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В PHP нет перегрузки методов (method overloading) в классическом виде, как в Java или C++, где можно определить несколько методов с одним именем, но разными сигнатурами параметров.

Однако есть два подхода для достижения похожего поведения:

  1. Использование магических методов __call() и __callStatic(): Они перехватывают вызовы несуществующих методов.

    class MathOperations {
        public function __call($name, $arguments) {
            if ($name === 'sum') {
                // Эмулируем перегрузку: sum() может принимать разное число аргументов
                return array_sum($arguments);
            }
            throw new BadMethodCallException("Method $name does not exist.");
        }
    }
    
    $math = new MathOperations();
    echo $math->sum(1, 2); // 3
    echo $math->sum(1, 2, 3, 4); // 10
  2. Методы с аргументами по умолчанию и вариадическими функциями: Можно создать один метод, который обрабатывает разные случаи.

    class Formatter {
        // Один метод обрабатывает разные сценарии
        public function format($data, string $style = 'default') {
            if (is_array($data)) {
                return $this->formatArray($data, $style);
            }
            if (is_numeric($data)) {
                return $this->formatNumber($data, $style);
            }
            return (string) $data;
        }
        // ... приватные методы formatArray, formatNumber
    }

Начиная с PHP 8, с объединёнными типами (union types) и именованными аргументами (named arguments) возможности для создания гибких API стали ещё лучше, уменьшив практическую необходимость в классической перегрузке.