как замыкания помогают в создании интерфейса DSL/fluent: примеры PHP?

Можете ли вы привести пример на PHP, показывающий, как замыкания помогают создавать DSL (свободный интерфейс)?

edit: Принятый ответ на следующий вопрос говорит о вложенных замыканиях. Если бы кто-то мог перевести этот пример на PHP, это тоже было бы полезно: плавные интерфейсы? Мне нужно ваше мнение!


person koen    schedule 24.05.2010    source источник


Ответы (1)


Это первый пример, который я мог придумать, он не очень хорош, но дает вам представление:

$db = new Database();
$filteredList = $db->select()
           ->from('my_table')
           ->where('id', 9)
           ->run()
           ->filter(function($record){
            // apply some php code to filter records
        });

Там я бы использовал плавные интерфейсы для запроса моей базы данных с помощью некоторого ORM, а затем применил бы некоторый фильтр к набору записей, который я получаю. Представьте, что метод run() возвращает объект RecordSet, у которого есть метод filter(), который может быть примерно таким:

public function filter ($callback)
{
    return array_filter($this->recordSet, $callback);
}

Вы поняли идею?

person El Barto    schedule 21.02.2012
comment
Не могли бы вы также привести конкретный пример вложенного замыкания с объектами? В ссылке, предоставленной исходным плакатом, принятый ответ дает следующий пример, чтобы предотвратить тупик: Database .ConnectionString(cs => cs.User("name"); .Pass("xxx")) .Timeout(100); Как бы вы сделали это в PHP? Насколько я пытался, вы не можете имитировать эту конструкцию в PHP. - person qrazi; 12.12.2012
comment
Я не уверен, понимаю ли я проблему или как она решается на Java. Однако я уверен, что в PHP есть способ обойти это (хотя он может отличаться от того, как это делается в Java). - person El Barto; 12.12.2012
comment
На самом деле это С#. Я работаю над функциональным тестированием с помощью Selenium и PHPUnit, используя шаблон Page Object. Я хотел бы свободно использовать объекты страницы. Допустим, у меня есть объект pageA и объект pageB, оба из которых используют одно и то же всплывающее окно (pageC). Какой объект вы возвращаете при закрытии всплывающего окна? В примере с C# вам не нужно об этом беспокоиться из-за вложенного замыкания. В моем примере это будет означать, что при закрытии всплывающего окна вы выходите из закрытия и продолжаете либо страницу A, либо страницу B. - person qrazi; 13.12.2012
comment
Я пытался использовать анонимную функцию, но, среди прочего, боролся с $this внутри анонимной функции. Альтернативой может быть отслеживание родителя (может быть, бинарное дерево?) и использование его для возврата к нужному объекту. На данный момент я просто останавливаю цепочку и помещаю всплывающее окно в новую переменную, делаю свои дела, а затем возвращаюсь к первой переменной. - person qrazi; 13.12.2012
comment
Хе-хе, ты прав, это С#, я не знаю, на что я смотрел. Я предлагаю вам задать новый вопрос, вставив пример кода, чтобы я, а также другие люди могли его увидеть и помочь вам. - person El Barto; 13.12.2012