3

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

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

在 C++ 中,我会通过重载来做到这一点——C++ 会根据数据类型/签名对事情进行分类——但这在 PHP 中不起作用。

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

TIA

4

3 回答 3

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可以做自己的事情来完成转弯。

于 2009-01-25T19:34:13.370 回答
2

我认为这会奏效...

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

    return false;
}
于 2009-01-25T19:08:05.700 回答
0

您需要在此处查看 PHP 手册以获取说明

于 2009-01-25T19:03:42.387 回答