Подтвердить что ты не робот

PHP два метода с тем же именем

Можно ли использовать два метода, имеющих одно и то же имя, но с разными аргументами?

Один из них был бы public static и принимал бы 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){
    ...
  }

}
4b9b3361

Ответ 1

Я просто предлагаю вам супер ленивый вариант:

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

Это вызовет getPrice_1 для 1 аргумента или getPrice_2, как вы догадались, два аргумента. Этого может быть достаточно для большинства случаев использования. Конечно, вы можете комбинировать обе альтернативы или сделать их более умными, ища все альтернативные имена реальных методов.

Если вы хотите, чтобы ваш API был довольно удобным и удобным в использовании, такие сложные способы решения приемлемы. Очень важно.

Ответ 2

Нет. PHP не поддерживает классическую перегрузку. (Он реализует что-то еще, что называется перегрузкой.)

Вы можете получить тот же результат, используя func_get_args() и связанные с ним функции:

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

Ответ 3

В настоящее время PHP не поддерживает перегрузку известным способом, но вы все еще можете достичь своей цели с помощью магических методов.

Из руководства PHP5: overloading.

Ответ 4

Вы могли бы, вроде... Я считаю это очень "взломанными" решениями, но вы можете сделать одну функцию и присвоить стандартное значение, которое в противном случае было бы нецелесообразно использовать, по мере необходимости. Тогда, если вы не передадите функции определенному параметру, она будет установлена ​​на fx "-1".

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

Или, если вам действительно нужен один статический метод, вы можете сделать метод, который оценивает, какой метод вызывать, и вызывать , что вместо вашего getPrice:

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

Как я уже сказал, очень "взломать" решения. Это не совсем красиво, и люди не ожидали, что вы это сделаете. Поэтому я бы не стал рекомендовать его, но он может помочь вам сделать то, что вы хотите.