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
Respuesta
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.
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.
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");
?>
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
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, solución interesante;) –
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
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
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.
sé que es un tema poco viejo, pero desde php56 puede:
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
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 ... } }
- 1. función con múltiples argumentos
- 2. parámetros con el mismo nombre
- 3. ¿Está bien tener múltiples formularios HTML con el mismo nombre?
- 4. jQuery Validar múltiples campos con el mismo nombre
- 5. ¿Cómo manejar múltiples cookies con el mismo nombre?
- 6. Clojure let permite enlaces múltiples con el mismo nombre
- 7. Cómo obtener múltiples parámetros con el mismo nombre de una URL en PHP
- 8. primavera con múltiples argumentos
- 9. xargs con múltiples argumentos
- 10. @selector con múltiples argumentos
- 11. @selector - ¿Con múltiples argumentos?
- 12. Usando el mismo decorador (con argumentos) con funciones y métodos
- 13. expansión de macros para las macros con argumentos frente a las variables con el mismo nombre
- 14. ¿Qué pasa con static_cast con múltiples argumentos?
- 15. Macro y la función con el mismo nombre
- 16. Definición de una función con múltiples argumentos implícitos en Scala
- 17. argumentos con nombre en C#
- 18. Clojure: argumentos con nombre
- 19. iOS performSelectorOnMainThread con múltiples argumentos
- 20. Argumentos con nombre opcionales en Mathematica
- 21. Argumentos de función múltiples tipos
- 22. Función de argumentos predeterminados y valores con nombre
- 23. múltiples asociaciones con el mismo modelo
- 24. ¿Puede argparse asociar argumentos posicionales con argumentos con nombre?
- 25. Automake y archivos con el mismo nombre
- 26. Functors con múltiples argumentos en OCaml
- 27. clase parcial con el método mismo nombre
- 28. ¿Formas múltiples con campos de entrada con el mismo atributo de nombre? ¿Bueno o malo?
- 29. Dos métodos genéricos con el mismo nombre
- 30. Función con argumentos predefinidos dependientes
¿Podría darnos un ejemplo de esto? –
¿Quiere decir funciones múltiples con el mismo nombre? – mck89