2013-06-26 15 views
5

Unterstützt php das Überladen von Methoden? Beim Versuch, den folgenden Code zu verwenden, wird vorgeschlagen, dass es das Überladen von Methoden unterstützt. Alle AnsichtenUnterstützt Php das Überladen von Methoden?

class test 
{ 
    public test($data1) 
    { 
    echo $data1; 
    } 
} 

class test1 extends test 
{ 
    public test($data1,$data2) 
    { 
     echo $data1.' '.$data2; 
    } 
} 

$obj = new test1(); 
$obj->test('hello','world'); 

Da ich die Methode überladen habe, gibt es die Ausgabe als "Hallo Welt". Das obige Code-Snippet schlägt vor, dass php das Überladen von Methoden unterstützt. Meine Frage ist, ob php das Überladen von Methoden unterstützt.

+0

Überprüfen Sie diese Antwort http://stackoverflow.com/a/4697712/387194, in Ihrem Fall verwenden Sie nicht überladen, sondern überschreiben. Die alte Funktion wird nicht ausgeführt, wenn Sie '$ obj-> test ('hallo') schreiben;' – jcubic

+0

Siehe: http://stackoverflow.com/questions/4697705/php-function-overloading – Arvind

Antwort

10

Sie sollten den Unterschied zwischen method overriding (Ihr Beispiel) machen und method overloading

Hier ist ein einfaches Beispiel, wie Methode in PHP Übersteuerung zu implementieren __call magische Methode:

class test{ 
    public function __call($name, $arguments) 
    { 
     if ($name === 'test'){ 
      if(count($arguments) === 1){ 
       return $this->test1($arguments[0]); 
      } 
      if(count($arguments) === 2){ 
       return $this->test2($arguments[0], $arguments[1]); 
      } 
     } 
    } 

    private function test1($data1) 
    { 
     echo $data1; 
    } 

    private function test2($data1,$data2) 
    { 
     echo $data1.' '.$data2; 
    } 
} 

$test = new test(); 
$test->test('one argument'); //echoes "one argument" 
$test->test('two','arguments'); //echoes "two arguments" 
+0

Wie mache ich eine von ihnen geschützt und die andere Öffentlichkeit? Es scheint, dass, wenn __call öffentlich sein muss, das die Tore weit öffnet? Anwendungsfall, öffentlicher Getter, geschützter Setter beide mit dem gleichen Namen wie die Dateneigenschaft ... oder Sie müssen möglicherweise Anruferinfo sezieren (könnte etwas verbose) – nus

+0

Ob ich mehrere Anruffunktionen hier haben kann? – Shan

+0

Bitte entwickeln Sie, was Sie mit * Mehrfachruffunktionen * meinen. Wenn dies nicht im Rahmen dieser Frage liegt, bitte posten Sie es als neue Frage. Ich bin sicher, dass Sie eine genaue Antwort bekommen werden. – skafandri

1

Also meine Frage Ist PHP unterstützt Methode Überladung (?).

Ja, aber nicht auf diese Weise, und in Ihrem Beispiel, schlägt es nicht, dass diese Art von Überlastung richtig ist, zumindest mit der Version 5.5.3 von ihm und error_reporting(E_ALL).

In dieser Version, wenn Sie versuchen, diesen Code auszuführen, gibt es Ihnen die folgenden Meldungen:

Strict Standards: Declaration of test1::test() should be compatible 
with test::test($data1) in /opt/lampp/htdocs/teste/index.php on line 16 

Warning: Missing argument 1 for test::test(), called in /opt/lampp/htdocs/teste/index.php 
on line 18 and defined in /opt/lampp/htdocs/teste/index.php on line 4 

Notice: Undefined variable: data1 in /opt/lampp/htdocs/teste/index.php on line 6 
hello world //it works, but the messages above suggests that it's wrong. 
0

Sie haben vergessen ‚Funktion‘ in beiden Fällen vor dem Test hinzuzufügen. Die Methode wird von einer Kindklasse aufgerufen, weil beim Aufruf einer Methode aus einem Kindklassenobjekt zuerst geprüft wird, ob diese Methode in der Kindklasse existiert. Wenn nicht, dann wird in geerbte Elternklasse mit öffentlicher oder geschützter Sichtbarkeitsüberprüfung gesucht und wenn Methode existiert Ergebnis entsprechend.

Verwandte Themen