2010-01-27 43 views
22

Empecé con OOP con Java, y ahora me estoy volviendo bastante pesado en PHP. ¿Es posible crear múltiplos de una función con diferentes argumentos como en Java? ¿O la naturaleza interpretada/no tipificada del lenguaje lo evitará y causará conflictos?Función con el mismo nombre con múltiples argumentos en PHP

+0

¿Podría darnos un ejemplo de esto? –

+1

¿Quiere decir funciones múltiples con el mismo nombre? – mck89

Respuesta

37

Todos los demás tienen respuestas con buenas explicaciones de código. Aquí hay una explicación en términos de más alto nivel: Java admite Method overloading, que es a lo que se refiere cuando habla de funciones con el mismo nombre pero diferentes argumentos. Como PHP es un lenguaje de tipado dinámico, esto no es posible. En cambio, PHP admite Default arguments que puede usar para obtener el mismo efecto.

1

No, esto no es posible, porque PHP no puede inferir de los argumentos qué función desea (no especifica qué tipos espera). Sin embargo, puede dar valores predeterminados a argumentos en php.

De esta forma la persona que llama puede dar diferentes cantidades de argumentos. Esto llamará la misma función sin embargo.

ejemplo es:

function test($a = true) 

Esto da un valor predeterminado de cierto si se dan 0 argumentos, y toma el valor de llamada si se da 1 argumento.

7

Respuesta corta: No. Solo puede haber una función con un nombre de pila.

Respuesta más larga: Puede hacerlo creando un sistema de inclusión intrincado que incluya la función con el número correcto de argumentos. O, mejor aún, puede aprovechar PHP permitiendo valores predeterminados para parámetros y también una cantidad variable de parámetros.

Para obtener el máximo de los valores por defecto simplemente asignar un valor a un parámetro en la definición de la función:

function do_something($param1, $param2, $param3 = 'defaultvaule') {} 

Es una práctica común para poner los parámetros con los valores por defecto al final de la declaración de la función, ya que se pueden omitir cuando la función se llama y hace que la sintaxis para usarlos más claro:

do_something('value1', 'value2'); // $param3 is 'defaultvaule' by default 

también puede enviar un número variable de parámetros mediante el uso de func_num_args() y func_get_arg() para obtener los argumentos:

<?php 
    function dynamic_args() { 
     echo "Number of arguments: " . func_num_args() . "<br />"; 
     for($i = 0 ; $i < func_num_args(); $i++) { 
      echo "Argument $i = " . func_get_arg($i) . "<br />"; 
     } 
    } 

    dynamic_args("a", "b", "c", "d", "e"); 
?> 
5

siguiente no es posible con php

function funcX($a){ 
    echo $a; 
} 
function funcX($a,$b){ 
    echo $a.$b; 
} 

En lugar de hacer esto forma

function funcX($a,$b=2){ 
    echo $a.$b; 
} 

funcX(1) mostrará 12, func(1,3) mostrará 13

32

Si está tratando con clases puede sobrecargar los métodos con __call() (vea Overloading) p.:

class Foo { 
    public function doSomethingWith2Parameters($a, $b) { 

    } 

    public function doSomethingWith3Parameters($a, $b, $c) { 

    } 

    public function __call($method, $arguments) { 
     if($method == 'doSomething') { 
      if(count($arguments) == 2) { 
      return call_user_func_array(array($this,'doSomethingWith2Parameters'), $arguments); 
      } 
      else if(count($arguments) == 3) { 
      return call_user_func_array(array($this,'doSomethingWith3Parameters'), $arguments); 
      } 
     } 
    }  
} 

entonces usted puede hacer:

$foo = new Foo(); 
$foo->doSomething(1,2); // calls $foo->doSomethingWith2Parameters(1,2) 
$foo->doSomething(1,2,3); // calls $foo->doSomethingWith3Parameters(1,2,3) 

Esto podría no ser el mejor ejemplo, pero __call puede ser muy útil a veces. Básicamente, puede usarlo para atrapar llamadas a métodos en objetos donde este método no existe.

Pero no es lo mismo o tan fácil como en Java.

+1

+1, solución interesante;) –

+0

Esto es bueno porque si los 2 argumentos son de un tipo de datos esperado diferente a los 3 argumentos, no tiene que preocuparse por verificar los tipos – andrewtweber

2

Como todos los demás dijeron, no es compatible por defecto. El ejemplo de Felix usando __call() es probablemente la mejor manera.

De lo contrario, si utiliza clases que heredan entre sí, siempre puede sobrecargar los nombres de los métodos en sus clases secundarias. Esto también le permite llamar al método principal.

tomar estas clases, por ejemplo ...

class Account { 
    public function load($key,$type) { 
    print("Loading $type Account: $key\n"); 
    } 
} 

class TwitterAccount extends Account { 
    public $type = 'Twitter'; 

    public function load($key) { 
    parent::load($key,$this->type); 
    } 
} 

Luego les puede llamar así ...

$account = new Account(); 
$account->load(123,'Facebook'); 

$twitterAccount = new TwitterAccount(); 
$twitterAccount->load(123); 

Y el resultado sería ...

 
Loading Facebook Account: 123 
Loading Twitter Account: 123 
0

La sobrecarga no es posible en PHP, pero puede evitarlo con los valores predeterminados de los parámetros, como se explica en otras respuestas.

El límite de esta solución alternativa es cuando se desea sobrecargar una función/método de acuerdo con los tipos de parámetros. Esto no es posible en PHP, uno debe probar los tipos de parámetros usted mismo o escribir varias funciones. Las funciones mín. Y máx. Son un buen ejemplo de esto: si hay un parámetro del tipo de matriz, devuelve el mínimo/máximo de la matriz, de lo contrario, devuelve el mínimo/máximo de los parámetros.

0

tuve la idea de algo como:

proceso de la función ($ param1, $ type = 'array') { switch ($ type) { case 'array': // hacer algo con él break; caso 'asociative_array': // hacer algo con él break; caso 'int_array': // hacer algo con él break; caso 'cadena': // hacer algo con él break; // etc etc ... } }

Cuestiones relacionadas