Вопрос

Я бы хотел сделать что-то вроде этого:Вызовите метод, скажите "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 для получения инструкций здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top