Immediately Invoked Function (IIF) w PHP

Bardzo fajnie jest móc w Javascript zrobić coś takiego:

(function(x){
 alert(x*2);
})();

Pozwala Ci to izolować zmienne w funkcji i spać spokojnie. Chciałbym móc zrobić coś takiego w PHP, od wersji 5.3 są domknięcia, więc teoretycznie powinno się dać.
Nie udało mi się jednak znaleźć tak zgrabnego rozwiązania. Jednak po kolei:

$myFunc = function() {
  echo "123";
};
$myFunc();

Jednak ciągle mamy tu zmienną $myFunc – istnieje ryzyko, że właśnie ją komuś nadpisujemy.

function inv($func){
  return $func();
}
inv(function(){ alert "123"; });

Już lepiej. Jednak chciałbym móc przekazać parametr(y) do mojej IIF. Dlatego finalna wersja mogłaby wyglądać tak:

function inv($func){
  $args = array();
  if(func_num_args() >1) {
    $args = func_get_args();
    unset($args[0]);
  }
  return call_user_func_array($func, $args);
}

$x = "global x";
inv(function($x){
  echo "=== inside";
  var_dump($x);
  $x = "local x";
  var_dump($x);
  echo "=== /";
}, $x);
var_dump($x);

Dzięki temu masz miło wyizolowaną zmienną $x i wszyscy są szczęśliwi. Taki mały Snippet of the day.

Tak z zupełnie innej beczki: znalazłem dziś w kodzie zmienną $Darek ;)

Share Button

Leave a Reply

Your email address will not be published. Required fields are marked *