2009-10-02 8 views
19

In Sprachen wie Java, Überlastung kann auf diese Art und Weise verwendet werden:Wofür wird die PHP-Funktion überladen?

void test($foo, $bar){} 
int test($foo){} 
Dann

wenn Sie angerufen würde test() mit 2 Argumenten z test($x, $y);, die erste Funktion aufgerufen werden. Wenn Sie nur 1 Argument übergeben haben, z. B. test($x);, wird die 2. Funktion aufgerufen.

Aus dem Handbuch scheint es, dass php 5 überladen hat, aber wofür ist es? Ich kann nicht scheinen, das Handbuch zu diesem Thema zu verstehen.

+0

Siehe auch [Warum PHP nicht über~~POS=TRUNC von Funktionen unterstützt?] (http://programmers.stackexchange.com/a/190550/ 84349). –

+0

Sie können überladbare Klasse in diesem Link verwenden: http://StackOverflow.com/Questions/4697705/PHP-Function-Overloading/27231803#27231803 –

Antwort

25

PHP's meaning of overloading ist anders als Java. In PHP bedeutet Überladen, dass Sie Objektmitglieder zur Laufzeit hinzufügen können, indem Sie some of the __magic methods, wie __get, __set, __call, __callStatic implementieren. Sie laden Objekte mit neuen Mitgliedern.

in PHP Überlastung sieht Mittel zum dynamisch "create" Eigenschaften und Methoden. Diese dynamischen Entitäten sind verarbeitet über magische Methoden kann man in einer Klasse für verschiedene Aktionstypen etablieren.

Ein Beispiel:

class Foo 
{ 
    public function __call($method, $args) 
    { 
     echo "Called method $method"; 
    } 
} 

$foo = new Foo; 

$foo->bar(); // Called method bar 
$foo->baz(); // Called method baz 

Und übrigens, unterstützt PHP diese Art seit PHP 4.3.0 von Überlastung. Der einzige Unterschied besteht darin, dass Sie in Versionen vor PHP 5 das Überladen mit der Funktion overload() explizit aktivieren mussten.

+0

Was können mögliche Vorteile dieser Art der Überladung, deren Beispiel Sie gaben? ?? –

+8

Ein Szenario, in dem sich '__call()' als sehr nützlich erwies, war, als ich eine Währungsumrechnungsklasse baute. Anstatt "$ converter-> convert (2, 'EUR', 'USD')" aufzurufen, könnte man '$ converter-> convertEurToUsd (2);' nennen, was meiner Meinung nach viel besser lesbar ist. Sie können sich meine Quellen ansehen: http://github.com/igstan/php-utils/blob/master/tests/CurrencyConverterTest.php http://github.com/igstan/php-utils/blob/master/ src/CurrencyConverter.php –

+2

Ich verwende diese Methode für eine dynamische LINQ-ähnliche Schnittstelle zu meiner Datenbank. Also kann ich Dinge tun wie $ db-> Select ('table') -> col_1 [$ value] -> col_2 [$ value] -> Zusammenführen ('col_1'); So rufen alle __(). Sie werden an die richtige Handling-Klasse weitergeleitet (d. H. SQL, File, Xml). – null

14

Wenn Sie eine Funktion zu überlasten, wie in Java, nicht angeben, alle Argumente und verwenden Sie die func_num_args und func_get_args Funktion die Anzahl der Argumente oder die Argumente selbst zu erhalten, die zu dieser Funktion übergeben wurden:

function test() { 
    $args = func_get_args(); 
    switch (count($args)) { 
     case 1: 
      // one argument passed 
      break; 
     case 2: 
      // two arguments passed 
      break; 
     default: 
      // illegal numer of arguments 
      break; 
    } 
} 
-1

laden über eine Funktion einfach nicht passieren Parameter als null standardmäßig

class ParentClass 
{ 
    function mymethod($arg1 = null, $arg2 = null, $arg3 = null) 
    { 
    if($arg1 == null && $arg2 == null && $arg3 == null){ 
     return 'function has got zero parameters <br />'; 
    } 
    else{ 
     $str = ''; 
     if($arg1 != null) 
     $str .= "arg1 = ".$arg1." <br />"; 

     if($arg2 != null) 
     $str .= "arg2 = ".$arg2." <br />"; 

     if($arg3 != null) 
     $str .= "arg3 = ".$arg3." <br />"; 

     return $str; 
     } 
    } 
} 

// and call it in order given below ... 

$obj = new ParentClass; 

echo '<br />$obj->mymethod()<br />'; 
echo $obj->mymethod(); 

echo '<br />$obj->mymethod(null,"test") <br />'; 
echo $obj->mymethod(null,'test'); 

echo '<br /> $obj->mymethod("test","test","test")<br />'; 
echo $obj->mymethod('test','test','test');