2009-10-02 13 views
19

En lenguajes como Java, la sobrecarga puede ser utilizado de esta manera:¿Para qué sirve la función de sobrecarga de PHP?

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

A continuación, si se llama a test() con 2 argumentos por ejemplo test($x, $y);, la primera función sería llamado. Si pasó solo 1 argumento, por ejemplo, test($x);, se invocará la segunda función.

Según el manual, parece que php 5 tiene sobrecarga, pero ¿para qué sirve? Parece que no puedo entender el manual sobre este tema ...

+0

Véase también [¿por qué PHP no soporta la sobrecarga de funciones?] (http://programmers.stackexchange.com/a/190550/ 84349). –

+0

Puede usar la clase sobrecargable en este enlace: http://stackoverflow.com/questions/4697705/php-function-overloading/27231803#27231803 –

Respuesta

25

PHP's meaning of overloading es diferente de Java. En PHP, la sobrecarga significa que puede agregar miembros de objeto en tiempo de ejecución, implementando some of the __magic methods, como __get, __set, __call, __callStatic. Cargas objetos con nuevos miembros.

Sobrecarga en PHP proporciona medios para dinámicamente "crear" propiedades y métodos. Estas entidades dinámicas son procesadas a través de métodos mágicos que uno puede establecer en una clase para varios tipos de acción .

Un ejemplo:

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

$foo = new Foo; 

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

Y, por cierto, PHP soporta este tipo de sobrecarga a partir de PHP 4.3.0. La única diferencia es que en las versiones anteriores a PHP 5 tenía que activar de forma explícita la sobrecarga utilizando la función overload().

+0

¿Cuáles pueden ser las posibles ventajas de ese tipo de sobrecarga cuyo ejemplo proporcionó? ?? –

+8

Un escenario en el que '__call()' demostró ser muy útil fue cuando construí una clase de conversión de moneda. En lugar de llamar a '$ converter-> convert (2, 'EUR', 'USD');' puedes llamar a '$ converter-> convertEurToUsd (2);', que es mucho más legible en mi opinión. Puede echar un vistazo a mis fuentes: http://github.com/igstan/php-utils/blob/master/tests/CurrencyConverterTest.php http://github.com/igstan/php-utils/blob/master/ src/CurrencyConverter.php –

+2

Utilizo este método para una interfaz dinámica tipo LINQ para mi base de datos. Entonces puedo hacer cosas como $ db-> Select ('tabla') -> col_1 [$ value] -> col_2 [$ value] -> Merge ('col_1'); Entonces todas las __calls(). Pasar a la clase de manejo correcta (es decir, SQL, File, Xml). – null

14

Si desea sobrecargar una función como en Java, no especifique ningún argumento y utilizar la función func_num_args y func_get_args para obtener el número de argumentos o de los mismos argumentos que se han pasado a esa función:

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

Para más carga de una función simplemente deje pasar como parámetro nulo por defecto,

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