2010-06-05 5 views
2

Je ne suis pas sûr que cette question stupide, mais je demande:
Donc, s'il y a une fonction anonyme, je peux le donner comme un autre paramètre de fonctions anonymes, si elle a déjà été stocké une variable.
Mais, dans ce cas, si j'ai stocké une seule fonction dans une variable, et y ajouter directement la seconde en tant que paramètre? Puis-je ajouter des paramètres à la fonction non-stockée?PHP: passer une fonction avec des paramètres comme paramètre

exemple Fist (c'est ce que je comprends :)):

$func = function($str){ return $str; }; 
$func2 = function($str){ return $str; }; 
$var = $func($func2('asd')); 

var_dump($var); 
// prints out string(3) "asd" 

Cela a du sens pour moi, mais ce qui est avec celui qui suit?

$func = function($str){ return $str; }; 
$var = $func(function($str = "asd"){ return $str; }); 

var_dump($var); 

/** This prints out: 
object(Closure)#1 (1) { 
    ["parameter"]=> 
    array(1) { 
    ["$str"]=> 
    string(10) "" 
    } 
} 
But why? 
*/ 

Et à la fin, quelqu'un peut-il me recommander un livre ou un article, de ce que je peux apprendre ce codage lambda fonction de php?

Répondre

6

$func simplement renvoie son argument, donc:

$var = $func(function($str = "asd"){ return $str; }); 

est le même que:

$var = function($str = "asd"){ return $str; }; 

Le fait que les fonctions anonymes sont des instances de Closure est un détail de mise en œuvre the docs mettent en garde contre compter sur. Il n'y a rien de spécial à propos de la fermeture. Il peut être implémenté en PHP normal grâce à la méthode magique __invoke.

Sur mon installation de PHP 5.3.2, Closure a une représentation différente. Le paramètre est marqué d'une chaîne "<optional>". C'est peut-être un problème de formatage.

php > $func = function($str){ return $str; }; 
php > $var = function($str = "asd"){ return $str; }; 
php > var_dump($var); 
object(Closure)#2 (1) { 
    ["parameter"]=> 
    array(1) { 
    ["$str"]=> 
    string(10) "<optional>" 
    } 
} 
+0

Merci, ce fut très utile, pour comprendre ce que je fais :) –

2

En deuxième exemple $ func renvoie simplement la fonction définie via les paramètres ..

façon de vous Easiest montrer est ainsi ..

$func = function($str){ return $str(); }; 
$var = $func(function($str = "asd"){ return $str; }); 

var_dump($var); 

Notez le() après « retour $ str » en $ func

Répondre au commentaire:

$func = function($str, $value){ return $str($value); }; 
$var = $func(function($str = "asd"){ return $str; }, 'efg'); 

var_dump($var); 
+0

Comprendre? La fonction est renvoyée non exécutée. Ainsi le() après $ str l'exécutera. – Phliplip

+0

Oui, j'ai compris, et comment ajouter une valeur à la variable '$ str' dans le paramètre sans nom, fonction? –

+0

Se répondre à votre commentaire dans la réponse – Phliplip

0
$func = function($str){ return $str; }; 

Génère une fermeture objet avec une fonction __invoke().

Cet objet est transmis en tant que paramètre dans le second exemple. Et comme la fonction anonimimus renvoie l'entrée, var_dump() affiche l'objet de fonction au lieu du résultat .

Dommage Enchaînement est pas pris en charge (comme en javascript)

$func = function($str){ return $str; }; 
$var = $func(function($str = "asd"){ return $str; }('test')); 
var_dump($var); 

pourrait entraîner "test" mais génère une erreur PHP Parse: erreur de syntaxe, unexpected '('

2
$func = function($str){ return $str; }; 
$var = $func(function($str = "asd"){ return $str; }); 

var_dump($var); 

D'abord, vous définissez une fonction $func qui renvoie simplement le premier paramètre, donc $ var devient function($str = "asd"){ return $str; }

Je peux recommander l'article IBM sur les fermetures et les fonctions lambda http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html.

Questions connexes