【问题标题】:PHP two methods with the same namePHP 两个同名方法
【发布时间】:2011-12-07 01:08:28
【问题描述】:

我可以让两个方法共享相同的名称但使用不同的参数吗?

一个是public static,需要2个参数,另一个是public,只需要一个参数

例子

class product{

  protected
    $product_id;

  public function __construct($product_id){
    $this->product_id = $product_id;
  }

  public static function getPrice($product_id, $currency){
    ...
  }

  public function getPrice($currency){
    ...
  }

}

【问题讨论】:

  • 据我了解,PHP 不支持多个方法签名。
  • 只有利用__call__callStatic处理程序并自己实现签名处理。仍然需要两个不同的真实方法名称。
  • 所以 __call 在对象上下文中调用函数时运行,而当函数像 class::function 一样调用时运行 __callStatic?我可以这样做,但我不知道如何确定每种方法的参数数量,因为我会有多种此类方法,而不仅仅是两个 :) 其中一些采用 3-4 个参数......

标签: php class methods


【解决方案1】:

没有。 PHP 不支持经典重载。 (它确实实现了其他称为重载的东西。)

您可以使用 func_get_args() 及其相关函数获得相同的结果:

function ech()
{
  $a = func_get_args();
  for( $t=0;$t<count($a); $t++ )
  {
    echo $a[$t];
  }
}

【讨论】:

    【解决方案2】:

    我只是给你超级懒惰的选择:

    function __call($name, $args) {
        $name = $name . "_" . implode("_", array_map("gettype", $args)));
        return call_user_func_array(array($this, $name), $args);
    }
    

    例如,这将为该类型的两个参数调用真正的函数名称getPrice_string_array。这就是具有真正方法签名重载支持的语言在幕后所做的事情。

    更懒惰的人只会计算参数:

    function __callStatic($name, $args) {
        $name = $name . "_" . count($args);
        return call_user_func_array(array($this, $name), $args);
    }
    

    这将为 1 个参数调用 getPrice_1,或者为两个参数调用 getPrice_2,您猜对了。对于大多数用例来说,这可能已经足够了。当然,您可以将这两种方法结合起来,或者通过搜索所有替代的真实方法名称来使其更聪明。

    如果您想让您的 API 保持美观和用户友好,则可以接受这种精心设计的变通方法。非常喜欢。

    【讨论】:

    • 谢谢,但 __callstatic 不起作用,"$this" 未定义。用'self'替换它似乎也不起作用,可能是因为我在父类中添加了这些神奇的方法?
    • 不,当然。 $this 在这种情况下是错误的。后期静态绑定可能不适用于 call_user_func_array。在这种情况下,您只能根据需要在每个子类中复制 __callStatic
    • 好的,它适用于call_user_func_array(array('static', $name), $args);,但问题是我无法检查该方法是否存在 :( 显然 method_exists 无法识别“静态”
    • 你可以试试is_callable。 (它应该是上下文感知的。)但是你可能对两者都不走运。这已经是一种不常见的用例了。 - 啊好吧。好主意。
    【解决方案3】:

    PHP 目前不支持以已知方式重载,但您仍然可以通过使用魔术方法来实现目标。

    来自 PHP5 手册:overloading

    【讨论】:

    • PHP STILL 目前不支持重载:P
    【解决方案4】:

    你可以,有点... 我认为它非常“破解”解决方案,但您可以创建一个函数并根据需要为参数分配一个标准值,否则将无法使用。那么如果你不给函数传递某个参数,它就会被设置为fx "-1"。

    public function getPrice($product_id = "-1", $currency) {
        if($product_id = "-1") {
            //do something
        }else {
            //do something
        }
    }
    

    或者,如果您确实需要一种方法是静态的,您可以创建一个方法来评估要调用的方法并调用 that 而不是您的 getPrice:

    public function whichGetPrice($product_id = "-1", $currency) {
        if($product !== "-1") {
            getStaticPrice($product_id, $currency);
        }else {
            getPrice($currency);
        }
    }
    

    就像我说的,非常“破解”的解决方案。这并不完全漂亮,也不是人们期望你这样做的方式。所以我不一定会推荐它,但它可以帮助你做你想做的事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2021-02-09
      • 1970-01-01
      • 2020-03-20
      • 2017-12-19
      相关资源
      最近更新 更多