2009-10-02 7 views
19

In linguaggi come Java, il sovraccarico può essere utilizzato in questo modo:Cos'è l'overloading di funzioni PHP?

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

Poi se si chiama test() con 2 argomenti per esempio test($x, $y);, la prima funzione sarebbe chiamato. Se hai passato solo 1 argomento, ad esempio test($x);, verrà chiamata la seconda funzione.

Dal manuale sembra che php 5 abbia sovraccarico, ma a cosa serve? Non riesco a capire il manuale su questo argomento ..

+0

Vedi anche [Perché PHP non supporta l'overloading di funzioni?] (http://programmers.stackexchange.com/a/190550/ 84349). –

+0

È possibile utilizzare la classe overloadable in questo collegamento: http://stackoverflow.com/questions/4697705/php-function-overloading/27231803#27231803 –

risposta

25

PHP's meaning of overloading è diverso da quello di Java. In PHP, sovraccaricare significa che è possibile aggiungere membri oggetto in fase di esecuzione, implementando some of the __magic methods, come __get, __set, __call, __callStatic. Carichi oggetti con nuovi membri.

sovraccarico in PHP fornisce mezzi per dinamicamente "creare" proprietà e metodi. Queste entità dinamiche sono elaborate tramite metodi magici. È possibile stabilire in una classe per i vari tipi di azione .

Un esempio:

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

$foo = new Foo; 

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

E, a proposito, PHP supporta questo tipo di sovraccarico a partire da PHP 4.3.0. L'unica differenza è che nelle versioni precedenti a PHP 5 è stato necessario attivare esplicitamente l'overloading utilizzando la funzione overload().

+0

Quali sono i possibili vantaggi di questo tipo di sovraccarico di cui è stato fornito l'esempio? ?? –

+8

Uno scenario in cui '__call()' si è dimostrato molto utile è stato quando ho creato una classe di convertitore di valuta. Invece di chiamare '$ converter-> convert (2, 'EUR', 'USD');' potresti effettivamente chiamare '$ converter-> convertEurToUsd (2);', che è molto più leggibile secondo me. Puoi dare un'occhiata alle mie fonti: http://github.com/igstan/php-utils/blob/master/tests/CurrencyConverterTest.php http://github.com/igstan/php-utils/blob/master/ src/CurrencyConverter.php –

+2

Io uso questo metodo per un'interfaccia dinamica simile a LINQ al mio database. Quindi posso fare cose come $ db-> Select ('table') -> col_1 [$ value] -> col_2 [$ value] -> Merge ('col_1'); Quindi tutti i __calls(). Passa alla classe di gestione corretta (ad esempio SQL, File, Xml). – null

14

Se si vuole sovraccaricare una funzione come in Java, non specificare alcun argomento e utilizzare la funzione func_num_args e func_get_args per ottenere il numero di argomenti o gli stessi argomenti che sono stati passati alla funzione:

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

per più di caricare una funzione semplicemente non passano parametro come nullo per difetto,

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