Bonsoir,
J'ai voulu parcourir les nouveautées de la version 7. Je suis maintenant confronté à un problème, existe-t-il un moyen d'utiliser la méthode call sur une closure avec en argument un tableau. Un code expliquera mieux ce que j'aimerais :

$response = new Response();
$params = [1, 2, 3];
$f = function(){...};
$f->call($response, 1, 2, 3); /*où 1, 2, 3 sont les valeurs du tableau, sachant qu'il peut varier en taille*/

Merci d'avance :)

4 réponses


Valérian
Réponse acceptée

Bonsoir,

Je pense qu'en utilisant call_user_func_array, tu devrais t'en sortir pour passer ton tableau en paramètre.

call_user_func_array( array( $f, 'call' ), array_merge( [$response], $params) );

Aucune garantie sur le code par contre...

Salut, bah... le code ne fonctionne pas avec ou sans tableau?

Tu veux récupérer tous les arguments sous forme de tableau? Si oui, utilise le mot clé ... avant le premier paramètre de ta closure.

$f = function (...$params) {
    return $params;
};

print_r($f->call($response, 1, 2, 3));
print_r($f->call($response, [1, 2, 3]));
print_r($f->call($response, 1, [2, 'trois', $response], 4, $f->call($response, 5)));

# Résultats:
# Sans le mot clé "...":
## 1
## Array ( [0] => 1 [1] => 2 [2] => 3 ) 
## 1

# Avec le mot clé "...":
## Array ( [0] => 1 [1] => 2 [2] => 3 ) 
## Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) 
## Array ( [0] => 1 [1] => Array ( [0] => 2 [1] => trois [2] => Response Object ( ) ) [2] => 4 [3] => 5 ) 

Si ça n'est pas ce que tu souhaites, je n'ai pas compris la question!?

Salut,

Pourquoi pas celà, tout simplement ?

$object = new Foo;
$param1 = [true, false];
$closure = function (array $arg) { /* ... */ }

$closure->call($object, $param1);
AlexJM
Auteur

Merci pour vos réponses,
Je n'avais pas pensé à une utilisation de call_user_func_array de cette façon, mais cela donne exactement ce que je veux :)

Et ce que je voulais c'était que dans ma closure j'ai $this qui vaille $request, et puis une liste de paramètres à la manière d'un router (c'est ce que je code) où on peut mettre function x($param1, $param2...)