PHP два метода с одинаковым именем - PullRequest
14 голосов
/ 07 декабря 2011

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

Один будет общедоступным 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){
    ...
  }

}

Ответы [ 4 ]

11 голосов
/ 07 декабря 2011

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

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

function ech()
{
  $a = func_get_args();
  for( $t=0;$t<count($a); $t++ )
  {
    echo $a[$t];
  }
}
5 голосов
/ 07 декабря 2011

Я просто даю вам супер-ленивую опцию:

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 был красивым и удобным, реализация таких сложных обходных путей приемлема.Очень сильно.

1 голос
/ 07 декабря 2011

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

Из руководства по PHP5: перегрузка .

0 голосов
/ 06 апреля 2016

Вы могли бы, в некотором роде ... Я считаю, что это очень "взломанные" решения, но вы могли бы сделать одну функцию и назначить стандартное значение, которое иначе было бы неприемлемым для использования, для параметров по мере необходимости.Тогда, если вы не передадите функции определенный параметр, он будет установлен в 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);
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...