Что-то вроде перегрузки в PHP?
-
20-08-2019 - |
Вопрос
Я бы хотел сделать что-то вроде этого:Вызовите метод, скажите "turn", а затем примените "turn" по-разному к разным типам данных, например, при вызове "turn" с помощью объекта / параметра "screwdriver" используется метод "turnScrewdriver", при вызове "turn" с помощью объекта / параметра "SteeringWheel" используется метод "turnSteeringWheel" и т.д.-- делаются разные вещи, но обе они называются "поворот".
Я бы хотел реализовать это так, чтобы вызывающему коду не нужно было беспокоиться о задействованных типах.В этом примере "поворота" должно быть достаточно, чтобы "повернуть" "отвертку", "рулевое колесо" или что-либо еще, что может потребоваться "повернуть".
В C ++ я бы сделал это с перегрузкой - и C ++ разобрался бы в зависимости от типа данных / подписи - но в PHP это не работает.
Есть какие-нибудь предложения относительно того, с чего мне следует начать?Оператор switch очевиден, но я думаю, что должно быть (более элегантное) OO-решение.Нет?
ТИА
Решение
Я прочитал решение davethegr8, но, похоже, можно было бы сделать то же самое с более строгой типизацией:
<?php
interface Turnable
{
public function turn();
}
class Screwdriver implements Turnable
{
public function turn() {
print "to turning sir!\n";
}
}
class SteeringWheel implements Turnable
{
public function turn() {
print "to everything, turn, turn turn!\n";
}
}
function turn(Turnable $object) {
$object->turn();
}
$driver = new Screwdriver();
turn($driver);
$wheel = new SteeringWheel();
turn($wheel);
$obj = new Object(); // any object that does not implement Turnable
turn($object); // ERROR!
PHP позволяет вам использовать подсказку типа для параметра, и подсказкой типа может быть имя интерфейса вместо имени класса.Таким образом, вы можете быть уверены, что если $object
реализует Turnable
интерфейс, то это должен иметь turn()
способ.Каждый класс , который реализует Turnable
может делать что-то свое, чтобы выполнить поворот.
Другие советы
Я думаю, это сработает...
function turn($object) {
if(method_exists($object, 'turn'.ucwords(get_class($object))) {
$fname = 'turn'.ucwords(get_class($object));
return $object->$fname();
}
return false;
}
Вам нужно ознакомиться с Руководством по PHP для получения инструкций здесь