Что-то вроде перегрузки в PHP? - PullRequest
3 голосов
/ 25 января 2009

Я хотел бы выполнить что-то вроде этого: вызвать метод, сказать «повернуть», а затем применить «поворот» по-разному к различным типам данных, например, вызвать «поворот» с использованием объекта «отвертка» / параметра метод "turnScrewdriver", вызов "turn" с помощью объекта / параметра "routWheel" использует метод "turnSteeringWheel" и т. д. - выполняются разные вещи, но оба они называются "turn".

Я бы хотел реализовать это так, чтобы вызывающему коду не приходилось беспокоиться о задействованных типах. В этом примере «поворота» должно быть достаточно, чтобы «повернуть» «отвертку», «рулевое колесо» или все, что может потребоваться для «поворота».

В C ++ я бы делал это с перегрузкой - а C ++ мог бы разбираться с вещами на основе типа данных / сигнатуры - но это не работает в PHP.

Какие-нибудь предложения относительно того, где я должен начать? Заявление о переключении очевидно, но я думаю, что должно быть (более элегантное) решение ОО. Нет

ТИА

Ответы [ 3 ]

8 голосов
/ 25 января 2009

Я прочитал решение 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, может выполнять свою задачу для выполнения поворота.

2 голосов
/ 25 января 2009

Я думаю, что это будет работать ...

function turn($object) {
    if(method_exists($object, 'turn'.ucwords(get_class($object))) {
        $fname = 'turn'.ucwords(get_class($object));
        return $object->$fname();
    }

    return false;
}
0 голосов
/ 25 января 2009

Вам необходимо проверить руководство PHP для получения инструкций здесь

...