Перегрузка методов в PHP
В традиционных объектно-ориентированных языках (таких как Java или C++) перегрузка методов позволяет определять несколько методов с одинаковым именем, но разными параметрами.
PHP не поддерживает традиционную перегрузку методов. Если попытатьс я определить два метода с одинаковым именем в классе, PHP выбросит фатальную ошибку.
Как PHP имитирует перегрузку
PHP использует «магические методы» для обеспечения аналогичной функциональности в динамическом режиме. Наиболее распространённый способ имитации перегрузки методов — использование __call() и __callStatic().
Пример с использованием __call()
Этот метод вызывается при обращении к недоступному методу в контексте объекта.
class Calculator {
public function __call($name, $arguments) {
if ($name === 'add') {
if (count($arguments) === 2) {
return $arguments[0] + $arguments[1];
} elseif (count($arguments) === 3) {
return $arguments[0] + $arguments[1] + $arguments[2];
}
}
}
}
$calc = new Calculator();
echo $calc->add(1, 2); // 3
echo $calc->add(1, 2, 3); // 6
Когда это полезно?
Применяется в следующих случаях:
- Обёртки над API, где методы определяются динамически.
- Паттерн Proxy.
- Гибкие интерфейсы, где количество аргументов может существенно варьироваться.
Разница между Overloading и Overriding
- Overloading (перегрузка): одинаковое имя метода, разные параметры (имитируется в PHP).
- Overriding (переопределение): одинаковое имя метода и параметры, но другая реализация в дочернем классе (полностью поддерживается в PHP).