2010-10-05 5 views
30

J'essayais d'emprunter quelques paradigmes de programmation de JS à PHP (juste pour le plaisir). Y at-il une façon de faire:Fonctions auto-exécutables en PHP5.3?

$a = (function(){ 
    return 'a'; 
})(); 

Je pensais que la combinaison de use cela peut être une belle façon de cacher les variables de style JS

$a = (function(){ 
    $hidden = 'a'; 
    return function($new) use (&$hidden){ 
     $hidden = $new; 
     return $hidden; 
    }; 
})(); 

en ce moment que je dois faire:

$temp = function(){....}; 
$a = $temp(); 

Il semble inutile ...

+1

difficile à comprendre pour moi ... :) exactement ce que vous vouliez dire .. –

+0

Je suis un peu confus ce que vous essayez d'accomplir ou pourquoi vous voulez exécuter des fonctions de cette façon. Bien que je sois à peu près sûr qu'il n'y a aucun moyen d'encapsuler une telle fonction en PHP. Les fonctions en javascript sont implémentées en classes, alors qu'en PHP ce sont des fonctions réelles. Pour cette raison, ils existent tous dans un espace de noms global, et non dans leur espace de noms autonome. La chose la plus proche d'une "fonction d'auto-appel" que je pourrais imaginer serait de définir la fonction dans 'eval()' – stevendesu

+0

XiroX: pourriez-vous envisager de poser une question? – salathe

Répondre

51

Function Call Chaining, e.g. foo()() is in discussion for PHP5.4. Jusque-là, utilisez call_user_func:

$a = call_user_func(function(){ 
    $hidden = 'a'; 
    return function($new) use (&$hidden){ 
     $hidden = $new; 
     return $hidden; 
    }; 
}); 

$a('foo');  
var_dump($a); 

donne:

object(Closure)#2 (2) { 
    ["static"]=> 
    array(1) { 
    ["hidden"]=> 
    string(3) "foo" 
    } 
    ["parameter"]=> 
    array(1) { 
    ["$new"]=> 
    string(10) "<required>" 
    } 
} 

Au PHP7, vous pouvez immédiatement exécuter des fonctions anonymes comme ceci:

(function() { echo 123; })(); // will print 123 
+0

Pourriez-vous éventuellement mettre à jour ce site? Serait apprécié. –

+1

@Hanoncs mis à jour pour php7 – Gordon

+3

Terrific, je n'ai aucun doute que ce sera une valeur pour la communauté et les futurs googleurs. –