valores - return value php function
Cómo pasar una cantidad variable de argumentos a una función de PHP (9)
Aquí hay una solución usando el método mágico __invoke
(Disponible desde php 5.3)
class Foo {
public function __invoke($method=null, $args=[]){
if($method){
return call_user_func_array([$this, $method], $args);
}
return false;
}
public function methodName($arg1, $arg2, $arg3){
}
}
Desde dentro de la misma clase:
$this(''methodName'', [''arg1'', ''arg2'', ''arg3'']);
Desde una instancia de un objeto:
$obj = new Foo;
$obj(''methodName'', [''arg1'', ''arg2'', ''arg3''])
Tengo una función PHP que toma una cantidad variable de argumentos (usando func_num_args()
y func_get_args()
), pero el número de argumentos que quiero pasar la función depende de la longitud de una matriz. ¿Hay alguna manera de llamar a una función PHP con una cantidad variable de argumentos?
Desde PHP 5.6 , se puede especificar una lista de argumentos variables con el ...
operador.
function do_something($first, ...$all_the_others)
{
var_dump($first);
var_dump($all_the_others);
}
do_something(''this goes in first'', 2, 3, 4, 5);
#> string(18) "this goes in first"
#>
#> array(4) {
#> [0]=>
#> int(2)
#> [1]=>
#> int(3)
#> [2]=>
#> int(4)
#> [3]=>
#> int(5)
#> }
Como puede ver, el ...
operador recopila la lista de variables de argumentos en una matriz.
Si necesita pasar los argumentos variables a otra función, el ...
aún puede ayudarlo.
function do_something($first, ...$all_the_others)
{
do_something_else($first, ...$all_the_others);
// Which is translated to:
// do_something_else(''this goes in first'', 2, 3, 4, 5);
}
Desde PHP 7 , la lista de variables de argumentos puede ser forzada a ser todo del mismo tipo también.
function do_something($first, int ...$all_the_others) { /**/ }
En un nuevo Php 5.6 , puede usar ... operator
lugar de usar func_get_args()
.
Entonces, al usar esto, puede obtener todos los parámetros que aprueba:
function manyVars(...$params) {
var_dump($params);
}
Esto ahora es posible con PHP 5.6.x , usando el operador ... (también conocido como operador splat en algunos idiomas):
Ejemplo:
function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
foreach ( $intervals as $interval ) {
$dt->add( $interval );
}
return $dt;
}
addDateIntervaslToDateTime( new DateTime, new DateInterval( ''P1D'' ),
new DateInterval( ''P4D'' ), new DateInterval( ''P10D'' ) );
Me sorprende que nadie aquí haya mencionado simplemente pasar y extract una matriz. P.ej:
function add($arr){
extract($arr, EXTR_REFS);
return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact(''one'', ''two'')); // 3
Por supuesto, esto no proporciona validación de argumentos . Para eso, cualquiera puede usar mi función de esperar: https://gist.github.com/iautomation/8063fc78e9508ed427d5
Para aquellos que buscan una forma de hacer esto con $object->method
:
call_user_func_array(array($object, ''method_name''), $array);
Tuve éxito con esto en una función de construcción que llama a una variable nombre_método con parámetros variables.
Puedes simplemente llamarlo.
function test(){
print_r(func_get_args());
}
test("blah");
test("blah","blah");
Salida:
Array ([0] => blah) Array ([0] => blah [1] => blah)
Si tiene argumentos en una matriz, puede interesarle la función call_user_func_array
.
Si la cantidad de argumentos que desea aprobar depende de la longitud de una matriz, probablemente signifique que puede empacarlos en una matriz por sí mismos, y usar esa para el segundo parámetro de call_user_func_array
.
Los elementos de esa matriz que pase serán luego recibidos por su función como parámetros distintos.
Por ejemplo, si tienes esta función:
function test() {
var_dump(func_num_args());
var_dump(func_get_args());
}
Puede empacar sus parámetros en una matriz, como esta:
$params = array(
10,
''glop'',
''test'',
);
Y, luego, llame a la función:
call_user_func_array(''test'', $params);
Este código será el resultado:
int 3
array
0 => int 10
1 => string ''glop'' (length=4)
2 => string ''test'' (length=4)
es decir, 3 parámetros; exactamente como iof la función se llamó de esta manera:
test(10, ''glop'', ''test'');
Una vieja pregunta, lo sé, sin embargo, ninguna de las respuestas aquí realmente hace un buen trabajo simplemente responder la pregunta.
Acabo de jugar con php y la solución se ve así:
function myFunction($requiredArgument, $optionalArgument = "default"){
echo $requiredArgument . $optionalArgument;
}
Esta función puede hacer dos cosas:
Si se llama con solo el parámetro requerido: myFunction("Hi")
Imprimirá "Hola por defecto"
Pero si se llama con el parámetro opcional: myFunction("Hi","me")
se imprimirá "Hola, yo";
Espero que esto ayude a cualquiera que esté buscando esto en el futuro.