2013-06-26 15 views
5

Fa sovraccaricare il metodo di supporto php. Mentre prova sotto il codice suggerisce che supporta l'overloading del metodo. Qualsiasi vistaIl metodo di supporto PHP supporta l'overloading

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

Come ho sovraccarico il metodo fornisce l'output come "ciao mondo". Lo snippet di codice precedente suggerisce php che supporta l'overloading dei metodi. Quindi la mia domanda è il sovraccarico del metodo di supporto php.

+0

Controlla questa risposta http://stackoverflow.com/a/4697712/387194, nel tuo caso non utilizzi sovraccarico ma sovrascrittura. La vecchia funzione non viene eseguita se si scrive '$ obj-> test ('hello');' – jcubic

+0

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

risposta

10

Si dovrebbe fare la differenza tra method overriding (il vostro esempio) e method overloading

Ecco un semplice esempio come implementare il metodo sovraccarico in PHP utilizzando __call metodo magico:

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

Come faccio a farne uno protetto e l'altro pubblico? Sembra che se __call debba essere pubblico, quel tipo di apertura spalanca le porte? Usa caso, getter pubblico, setter protetto con lo stesso nome della proprietà data ... o potresti dover analizzare le informazioni sul chiamante (potrebbe diventare un po 'prolisso) – nus

+0

Se posso avere più funzioni di chiamata qui? – Shan

+0

Sviluppa cosa intendi per * più funzioni di chiamata *. Se è fuori dallo scopo di questa domanda, per favore pubblicala come una nuova domanda. Sono sicuro che otterrai una risposta accurata. – skafandri

1

Quindi la mia domanda è il metodo di supporto php overloading (?).

Sì, ma non in quel modo, e, nel tuo esempio, non suggerisce che questo tipo di sovraccarico è corretta, almeno con la versione 5.5.3 di esso e error_reporting(E_ALL).

In quella versione, quando si tenta di eseguire questo codice, ti dà i seguenti messaggi:

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

Hai dimenticato di aggiungere 'funzione' prima della prova in entrambi i casi. Il metodo viene chiamato di classe figlio perché quando si richiama un metodo dall'oggetto classe figlio per prima cosa controlla se quel metodo esiste nella classe figlio, in caso contrario esamina la classe genitore ereditata con visibilità pubblica o protetta e se esiste un metodo che restituisce il risultato in base a ciò.

Problemi correlati