PHP twee methoden met dezelfde naam

Kan ik twee methoden hebben die dezelfde naam delen, maar met verschillende argumenten?

De ene zou openbaar statisch zijn en zou twee argumenten moeten aannemen, de andere is gewoon openbaar en neemt slechts één argument

voorbeeld

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

}
13
dus __call wordt uitgevoerd wanneer de functie wordt aangeroepen in de context van het object en __callStatic wanneer de functie wordt aangeroepen, zoals class :: function? Ik zou dat kunnen doen, maar ik weet niet hoe ik het aantal argumenten voor elke methode moet bepalen, omdat ik meerdere methoden van dit type zou hebben, niet slechts twee :) En sommige ervan nemen als 3-4 argumenten ...
toegevoegd de auteur Alex, de bron
Alleen door gebruik te maken van de __ call en __ callStatic handler en de handtekeninghandeling zelf uit te voeren. Zou nog steeds twee verschillende namen van echte methoden nodig hebben.
toegevoegd de auteur mario, de bron
PHP biedt geen ondersteuning voor meerdere methodeshandtekeningen voor zover ik begrijp.
toegevoegd de auteur Jared Farrish, de bron

4 antwoord

Nee. PHP biedt geen ondersteuning voor klassieke overbelasting. (Het implementeert iets anders dat overbelasting wordt genoemd.)

U kunt hetzelfde resultaat krijgen door func_get_args() en de bijbehorende functies te gebruiken:

function ech()
{
  $a = func_get_args();
  for( $t=0;$t
11
toegevoegd
toegevoegd de auteur Jared Farrish, de bron

Ik geef je gewoon de super luie optie:

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

Dat zou bijvoorbeeld de echte functienaam getPrice_string_array voor twee parameters van dat type aanroepen. Dat is een beetje van welke talen met ondersteuning voor overbelastingen met echte methodesignatuur achter de schermen zouden werken.

Zelfs luiheid zou alleen maar de argumenten tellen:

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

Dat zou getPrice_1 voor 1 argument aanroepen, of getPrice_2 voor, je raadt het al, twee argumenten. Dit is misschien al voldoende voor de meeste use-cases. Natuurlijk kun je beide alternatieven combineren, of het slimmer maken door te zoeken naar alle alternatieve echte methodenamen.

Als u uw API mooi en gebruiksvriendelijk wilt houden, is een dergelijke uitgebreide oplossing acceptabel. Heel erg.

5
toegevoegd
Bedankt, maar __callstatic werkt niet, "$ this" is undefined. Het vervangen van het 'zelf' lijkt ook niet te werken, misschien omdat ik deze magische methoden in de bovenliggende klasse heb toegevoegd?
toegevoegd de auteur Alex, de bron
ok het werkt met call_user_func_array (array ('static', $ name), $ args); maar het probleem is dat ik niet kan controleren of de methode bestaat :( blijkbaar geeft method_exists geen 'static'
toegevoegd de auteur Alex, de bron
het werkt met get_called_class() : D bedankt !!
toegevoegd de auteur Alex, de bron
Nee, natuurlijk. $ this was fout in die context. Late statische binding werkt mogelijk niet met call_user_func_array. In dat geval kunt u de __ callStatic in elke subklasse alleen dupliceren zoals vereist.
toegevoegd de auteur mario, de bron
In plaats daarvan kunt u is_callable proberen. (Het is vermoedelijk contextbewust.) Maar misschien heb je pech met beide. Dat is nogal een ongewoon gebruik. -- AH oke. Ook een goed idee.
toegevoegd de auteur mario, de bron

PHP ondersteunt momenteel geen overbelasting op bekende wijze, maar je kunt je doel nog steeds bereiken met behulp van magische methoden.

Van PHP5 handleiding: overbelasting .

1
toegevoegd
PHP STILL ondersteunt momenteel geen overbelasting: P
toegevoegd de auteur Bsienn, de bron

Dat zou kunnen, soort van ... Ik beschouw het als zeer veel "hack" -oplossingen, maar je zou een enkele functie kunnen maken en een standaardwaarde kunnen toewijzen die anders niet in orde zou zijn om te gebruiken, naar de parameters waar nodig. Als u vervolgens de functie een bepaalde parameter niet doorgeeft, wordt deze ingesteld op fx "-1".

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

Of als u echt één methode nodig hebt om statisch te zijn, dan kunt u een methode maken die evalueert welke methode u moet bellen en die moet aanroepen in plaats van uw getPrice:

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

Zoals ik al zei, heel veel "hack" -oplossingen. Het is niet bepaald mooi, noch een manier waarop mensen van je verwachten dat je het doet. Dus ik zou het niet per se aanbevelen, maar het kan je helpen doen wat je wilt.

0
toegevoegd