我想完成这样的:调用方法,说“转”,然后有“转”不同地应用于不同的数据类型,例如,调用“转”与“螺丝刀”对象/ PARAM用途所述“turnScrewdriver”的方法,调用“转”与“方向盘”对象/ PARAM使用“turnSteeringWheel”法等 - “转”不同的事情被完成的,但是他们都称为

我想实现这一点,以便调用代码不用担心所涉及的类型。在这个例子中,“转”应足以“转”一个“螺丝刀”,“方向盘”,或任何可能需要“导通”。

在C ++中我会做这个超载 - 和C ++的东西会基于该数据类型/签名排序 - 但这并不在PHP工作

任何建议,我应该在哪里开始呢? switch语句是显而易见的,但我想,必须有一个(更优雅)OO解决方案。否?

TIA

有帮助吗?

解决方案

我读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