36

I was trying to borrow some programing paradigms from JS to PHP (just for fun). Is there a way of doing:

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

I was thinking that with the combination of use this can be a nice way to hide variables JS style

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

right now I need to do:

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

It seems pointless...

AriehGlazer
  • 2,220
  • 8
  • 26
  • 29
  • 1
    hard to understand for me... :) what exactly you meant.. – Chetan Sharma Oct 05 '10 at 17:02
  • I'm a little confused what you're trying to accomplish or why you want to execute functions this way. Although I'm pretty sure there is no way to encapsulate a function like that in PHP. Functions in javascript are implemented as classes, whereas in PHP they are actual functions. For this reason they all exist within a global namespace, not within their self-contained namespace. The closest thing to a "self-calling function" I could imagine would be to define the function within `eval()` – stevendesu Oct 05 '10 at 17:03
  • XiroX: would you perhaps consider asking a question? – salathe Oct 05 '10 at 18:01
  • 3
    PHP5.3 have lambda support, and so I wanted to know if there was a way of invoking them without assigning them to a variable. – AriehGlazer Oct 06 '10 at 13:28

1 Answers1

68

Function Call Chaining, e.g. foo()() is in discussion for PHP5.4. Until then, use call_user_func:

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

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

gives:

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

As of PHP7, you can immediately execute anonymous functions like this:

(function() { echo 123; })(); // will print 123
Gordon
  • 312,688
  • 75
  • 539
  • 559