$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');
但后来我不知道如何转换这些字符串来运行一些实际的代码,或者如何传递参数。
必须有一个很好的方式来做我想要的。怎么样?
答案 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
,它允许您根据表示其名称的字符串调用函数。