PHP 两个同名的方法

2022-08-31 01:04:12

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

一个是公共静态的,需要2个参数,另一个只是公共的,只接受一个参数

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){
    ...
  }

}

答案 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);
}

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

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

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

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

如果你想保持你的API漂亮和用户友好,实现这种复杂的解决方法是可以接受的。非常多。


推荐