像PHP中的重载一样?

Par*_*der 3 php oop overloading

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

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

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

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

TIA

Bil*_*win 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!
Run Code Online (Sandbox Code Playgroud)

PHP允许您对参数使用类型提示,类型提示可以是接口名称而不是类名.所以你可以肯定,如果$object实现Turnable接口,那么它必须turn()方法.每个实现的类都Turnable可以自己完成转换.