2009-04-13 21 views
104

Me parece recordar que en PHP hay una forma de pasar una matriz como una lista de argumentos para una función, desreferenciando la matriz en la forma estándar func($arg1, $arg2). Pero ahora estoy perdido en cómo hacerlo. Recuerdo la manera de pasar por referencia, cómo "glob" los parámetros entrantes ... pero no cómo deslistar la matriz en una lista de argumentos.Pasando una matriz como argumentos, no una matriz, en PHP

Puede ser tan simple como func(&$myArgs), pero estoy bastante seguro de que no lo es. Pero, lamentablemente, el manual de php.net no ha divulgado nada hasta el momento. No es que haya tenido que usar esta característica particular durante el último año más o menos.

Respuesta

74

También tenga en cuenta que si desea aplicar un método de instancia a una matriz, que necesita para aprobar la función como:

call_user_func_array(array($instance, "MethodName"), $myArgs); 
+4

@understack El ejemplo '$ foo-> bar()' en la [página vinculada] (http://www.php.net/ manual/es/function.call-user-func-array.php) sugiere que debe ser 'array ($ instance," MethodName ")'. –

+11

Impresionante, utilicé esto para evitar la duplicación de argumentos de constructor en una clase secundaria :) 'call_user_func_array (array (parent," __construct "), func_get_args());' – Jason

9

Para mayor abundamiento, a partir de PHP 5.1 funciona esto, también:

<?php 
function title($title, $name) { 
    return sprintf("%s. %s\r\n", $title, $name); 
} 
$function = new ReflectionFunction('title'); 
$myArray = array('Dr', 'Phil'); 
echo $function->invokeArgs($myArray); // prints "Dr. Phil" 
?> 

Ver: http://php.net/reflectionfunction.invokeargs

En lugar de los métodos, usa ReflectionMethod::invokeArgs y pasa el objeto como primer parámetro.

+0

¡Esto es lo que he estado buscando! – Dejv

65

As has been mentioned, a partir de PHP 5.6+ también se puede utilizar el ... token (también conocido como "operador splat") como parte de la funcionalidad funciones variadic (see here for more info)

<?php 
$array = ['Hello', 'World']; 

function variadic($arg1, $arg2) 
{ 
    // Do stuff 
    echo $arg1.' '.$arg2; 
} 

// Splat $array in function call 
variadic(...$array); 

// Will echo 'Hello World' 

Nota: Los elementos de la matriz se asignan a argumentos por su posición en la matriz, no sus claves.

EDITAR

De acuerdo con el comentario de CarlosCarucce, argumento de desembalaje (como se muestra arriba) es el método más rápido, con mucho, en todos los casos. En algunos casos, es más de 5 veces más rápido que call_user_func_array.

TAMBIÉN

porque creo que esto es realmente útil (aunque no directamente relacionada con la pregunta): usted puede type-hint the splat operator parameter en su definición de función para asegurarse de que todos los valores pasados ​​que coincida con un tipo específico.

(Sólo recuerde que al hacer esto se MUST sea el parámetro última se define y que contiene todas parámetros pasados ​​a la función en la matriz.)

Esto es grande para asegurarse de una matriz contiene elementos de un tipo específico:

<?php 

// Define the function... 

function variadic(SomeClass ...$items) 
{ 
    // All items will be of type `SomeClass` 
    foreach ($items as $item) { 
     $item->someClassInstanceMethod(); 
    } 
} 

// Then call... 

variadic(new SomeClass, new SomeClass); 

// OR 

$items = [ 
    new SomeClass, 
    new SomeClass, 
]; 

variadic(...$items); 
+5

Esto tiene una gran mejora de rendimiento sobre 'call_user_func_array'. Entonces, si estás usando php 5.6+, te recomendaría este. [Aquí hay una prueba] (https://gist.github.com/nikic/6390366), que se citó en la [wiki oficial de php] (https://wiki.php.net/rfc/argument_unpacking) – CarlosCarucce

Cuestiones relacionadas