2

我们正在开发一个 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; }
             )

所以我的第一个问题是是否有办法以可序列化的格式(如字符串)存储闭包,然后在类被反序列化后将其转换回闭包?

或者任何人都可以提供一个更好的界面来解决这种回调问题的建议吗?

4

1 回答 1

1

关于如何使用反射来扩展闭包来做你想做的事,有一篇优秀而详细的文章:Extending PHP 5.3 Closures with Serialization and Reflection。也就是说,我想知道这是否比您的原始解决方案更尴尬,因为您必须改为传递对象 - 它实际上只是对其进行了略微不同的编码,并且您最终可能会受到性能影响。

于 2010-10-31T23:46:41.310 回答