【问题标题】:Something like overloading in PHP?类似于 PHP 中的重载?
【发布时间】:2009-01-25 19:00:06
【问题描述】:

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

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

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

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

TIA

【问题讨论】:

    标签: php oop overloading


    【解决方案1】:

    我阅读了 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的类都可以做自己的事情来完成转向。

    【讨论】:

    • 非常好。我第一时间想到的是接口继承,但是在学习OOP之前我就离开了PHP世界。
    • 好转阶段先生!说得好。 +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;
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-11-09
        • 2011-11-23
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 2015-08-21
        相关资源
        最近更新 更多