Рекомендуемые решения для создания обратного вызова, который объединяет несколько методов и / или свойств? - PullRequest
2 голосов
/ 08 октября 2010

Мы работаем над интерфейсом типа Builder, который в основном создает список для выполнения CRUD-управления отдельными объектами (поскольку мы используем ActiveRecord объект == запись базы данных).

Чтобы сделать гибким задание значений столбца и параметров для параметров списка, мы первоначально реализовали аргументы обратного вызова в виде массива, который выглядел следующим образом:

'params' => array(
              'static' => $this->institution->id, 
              array(
                'method1' => array(
                                'method_name', 
                                array('arg1', 'arg2')
                             ), 
                             'prop1' => 'id')

Это решение имеет ряд очевидных недостатков только с точки зрения неловкости и т. Д., Но оно сработало.

По предложению коллеги мы попытались реализовать замыкания, но из-за другого требования к классу мы должны сериализовать все данные в классе, которые, как мы только что обнаружили, не будут работать с замыканиями. Синтаксис с замыканиями был, очевидно, намного проще:

'params' => array(
               $this->institution->id,
               function($obj) { return $obj->method_name($arg1, $arg2)->id; }
             )

Итак, мой первый вопрос: есть ли способ сохранить замыкание в сериализуемом формате (например, в строке), а затем преобразовать его обратно в замыкание после того, как класс не будет сериализован?

Или кто-нибудь может предложить более удобный интерфейс для решения такой проблемы с обратным вызовом?

1 Ответ

1 голос
/ 01 ноября 2010

Существует отличный и подробный пост о том, как использовать Reflection для расширения замыканий, чтобы делать то, что вы хотите: Расширение PHP 5.3 Замыканий с сериализацией и отражением . Тем не менее, мне интересно, если это немного менее неловко, чем ваше оригинальное решение, поскольку вам придется вместо этого передавать объекты - это фактически просто кодирует его немного по-другому, и вы можете просто получить снижение производительности.

...