像PHP中的重载一样?

时间:2009-01-25 19:00:06

标签: php oop overloading

我想完成这样的事情:调用一个方法,说“转”,然后对不同的数据类型进行不同的“转向”,例如,用“螺丝刀”对象调用“turn”/ param使用“turnScrewdriver”方法,用“steeringWheel”对象/ param调用“turn”使用“turnSteeringWheel”方法等等 - 正在做不同的事情,但它们都被称为“转向”。

我想实现这一点,以便调用代码不必担心涉及的类型。在这个例子中,“转弯”应该足以“转动”“螺丝刀”,“steeringWheel”或任何可能需要“转动”的东西。

在C ++中,我会通过重载执行此操作 - 并且C ++会根据数据类型/签名对事物进行排序 - 但这在PHP中不起作用。

有关我应该从哪里开始的任何建议? switch语句很明显,但我认为必须有一个(更优雅的)OO解决方案。否?

TIA

3 个答案:

答案 0 :(得分:8)

我阅读了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的类都可以自己完成转换。

答案 1 :(得分:2)

我认为这会奏效......

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

    return false;
}

答案 2 :(得分:0)

您需要查看PHP手册以获取说明here