PHP:将函数传递给类

时间:2009-11-26 14:59:52

标签: php

我上了课。我给它一些对象(主要是retreived数据库行)作为输入,并告诉它必须显示哪些字段,以及我想要的按钮。然后它呈现一个非常好的html表!我认为这非常棒。

$ot = new ObjectTable();
$ot->objects = $some_objects;
$ot->fields = array('id','name','description','image');
$ot->buttons = array('edit','delete');
$ot->render();

但是,我也希望能够操纵它显示的数据。例如,我希望能够截断“描述”字段。或者显示图像缩略图(而不是'picture.jpg'作为文本)。我不知道如何将这些函数传递给类。也许是这样的事情:

$ot->functions = array(null,null,'truncate','thumbnail');

但后来我不知道如何转换这些字符串来运行一些实际的代码,或者如何传递参数。

必须有一个很好的方式来做我想要的。怎么样?

5 个答案:

答案 0 :(得分:7)

检查此question,答案是:

  

从PHP5.3开始,您可以使用闭包   或者传递方法的仿函数   周围。在此之前,你可以写   一个匿名函数   create_function(),但就是这样   相当尴尬。

但是,您尝试实现的目标最好通过将过滤器对象传递给渲染器来解决。所有过滤器都应使用相同的方法,因此您可以以策略模式的方式使用它,例如首先编写一个接口:

interface Filter
{
    public function filter($value);
}

然后编写实现接口的过滤器

class TruncateFilter implements Filter
{
    protected $_maxLength;
    public function __construct($maxLength = 50)
    {
        $this->_maxLength = (int) $maxLength;
    }
    public function filter($value)
    {
        return substr(0, $this->_maxLength, $value) . '…';
    }
}

为您的ObjectTable提供接受过滤器的方法

public function addFilter($field, Filter $filter)
{
    if(in_array($field, $this->fields)) {
        $this->_filters[$field][] = $filter;
    }
    return $this;
}

当您进行ObjectTable实例化时,请使用

$ot = new ObjectTable();
$ot->objects = $some_objects;
$ot->fields = array('id','name','description','image');
$ot->addFilter('description', new TruncateFilter)
   ->addFilter('name', new TruncateFilter(10))
   ->addFilter('image', new ThumbnailFilter);

然后修改render()方法以检查是否为要渲染的字段设置了任何过滤器,并对它们调用filter()方法。

public function render()
{
    foreach($this->fields as $field) {
        $fieldValue = // get field value somehow
        if(isset($this->filters[$field])) {
            foreach($this->filters[$field] as $filter) {
               $fieldValue = $filter->filter($fieldValue)
            }
        }
        // render filtered value
    }
}

这样您就可以添加无限过滤器。

答案 1 :(得分:3)

PHP有一个pseudo-type called "callback",这实际上是伪装的丑陋闭包。您可以使用call_user_func()call_user_func_array()来调用此类回调:

$callback = 'strlen';
echo call_user_func($callback, '123');
// will output 3 (unless you're using a strange encoding)

答案 2 :(得分:2)

您正在寻找create_function()

但是,在运行时创建函数并将它们添加到类中对我来说听起来并不合适。很快就会成为维护噩梦。有更好的方法来实现你想要的。对数据的功能会有什么样的操作?如何将它们存储在“工具”类中并在需要时将其与表对象连接?

答案 3 :(得分:2)

$ functions = array(null,null,'truncate','thumbnail');
$ function_1 = $ functions [3];
$ my_string ='string to truncate';

$ result = call_user_func($ functions [2],$ my_string);

如果要传递多个参数,请改用call_user_func_array。

答案 4 :(得分:1)

您可能还想探索call_user_func,它允许您根据表示其名称的字符串调用函数。