2010-10-05 10 views
30

Estaba tratando de tomar prestados algunos paradigmas de programación de JS a PHP (solo por diversión). ¿Hay una manera de hacerlo:Funciones de autoejecución en PHP5.3?

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

Estaba pensando que con la combinación de use esto puede ser una buena manera de ocultar las variables de estilo de JS

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

ahora tengo que hacer:

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

parece inútil ...

+1

difícil de entender para mí ... :) qué significa exactamente .. –

+0

Estoy un poco confundido de lo que estás tratando de lograr o por qué quieres ejecutar funciones de esta manera. Aunque estoy bastante seguro de que no hay forma de encapsular una función como esa en PHP. Las funciones en javascript se implementan como clases, mientras que en PHP son funciones reales. Por esta razón, todos ellos existen dentro de un espacio de nombres global, no dentro de su espacio de nombres independiente. Lo más parecido a una "función de auto-llamada" que podría imaginar sería definir la función dentro de 'eval()' – stevendesu

+0

XiroX: ¿podría considerar hacer una pregunta? – salathe

Respuesta

51

Function Call Chaining, e.g. foo()() is in discussion for PHP5.4. Hasta entonces, utilizar call_user_func:

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

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

da:

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

A partir de PHP7, puede ejecutar inmediatamente funciones anónimas como esto:

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

¿Sería posible que pueda actualizar esto? Sería apreciado. –

+1

@Hanoncs actualizado para php7 – Gordon

+3

Estupendo, no tengo dudas de que será un valor para la comunidad y los futuros usuarios de Google. –

Cuestiones relacionadas