Pull to refresh

Лямбда вычисления и замыкание

Reading time2 min
Views2.1K
В конце 2007 года был предложен патч, добавляющий лямбда функций (но без замыканий) для PHP. В ходе дискуссии в списке рассылки, было решено, что без поддержки замыканий, нет необходимости добавлять их в PHP.
Тем не менее, интерес к этой теме привел к существенным изменением первоначального патча Кристиана Сайлера (Christian Seiler) и выпуску Дмитрием Стоговым (Dmitry Stogov) нового патча.

В результате мы имеем замыкание и лямбда функции в PHP (5.3)




function getAdder($x) {
   return function ($y) use ($x) {
    // or: lexical $x;
    return $x + $y;
   };
  }
//---- OOP

  class Example {
    private $search;
    public function __construct ($search) {
     $this->search = $search;
    }
    public function setSearch ($search) {
     $this->search = $search;
    }
    public function getReplacer ($replacement) {
     return function ($text) use ($replacement) {
      return str_replace ($this->search, $replacement, $text);
     };
    }
   }
   $example = new Example ('hello');
   $replacer = $example->getReplacer ('goodbye');
   echo $replacer ('hello world'); // goodbye world
   $example->setSearch ('world');
   echo $replacer ('hello world'); // hello goodbye

   class Example {
    public function __invoke () {
     echo «Hello World!\n»;
    }
   }
   $foo = new Example;
   $foo ();
  
   //---  Reflection

   class Example {
    static function printer () { echo «Hello World!\n»; }
   }
   $class = new ReflectionClass ('Example');
   $method = $class->getMethod ('printer');
   $closure = $method->getClosure ();
   $closure ();
* This source code was highlighted with Source Code Highlighter.


Ждем с нетерпением выхода PHP 5.3




Источники:


Upd: Узнать больше о пользе этих нововведений можно в документации к таким языкам как Erlang, ECMAScript, Ruby

Реализовать подобный функционал можно было и раньше, это просто «синтаксический сахар»
Tags:
Hubs:
Total votes 46: ↑39 and ↓7+32
Comments159

Articles