我想完成这样的事情:调用一个方法,说“转”,然后对不同的数据类型进行不同的“转向”,例如,用“螺丝刀”对象调用“turn”/ param使用“turnScrewdriver”方法,用“steeringWheel”对象/ param调用“turn”使用“turnSteeringWheel”方法等等 - 正在做不同的事情,但它们都被称为“转向”。
我想实现这一点,以便调用代码不必担心涉及的类型。在这个例子中,“转弯”应该足以“转动”“螺丝刀”,“steeringWheel”或任何可能需要“转动”的东西。
在C ++中,我会通过重载执行此操作 - 并且C ++会根据数据类型/签名对事物进行排序 - 但这在PHP中不起作用。
有关我应该从哪里开始的任何建议? switch语句很明显,但我认为必须有一个(更优雅的)OO解决方案。否?
TIA
答案 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