Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:将函数传递给类_Php - Fatal编程技术网

PHP:将函数传递给类

PHP:将函数传递给类,php,Php,我上了一节课。我给它一些对象(大部分是检索的数据库行)作为输入,并告诉它必须显示哪些字段,以及需要哪些按钮。然后它呈现一个非常好的html表!我认为这非常棒 $ot = new ObjectTable(); $ot->objects = $some_objects; $ot->fields = array('id','name','description','image'); $ot->buttons = array('edit','delete'); $ot->rend

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

$ot = new ObjectTable();
$ot->objects = $some_objects;
$ot->fields = array('id','name','description','image');
$ot->buttons = array('edit','delete');
$ot->render();
然而,我也希望能够操纵它显示的数据。例如,我希望能够截断“description”字段。或者显示图像缩略图(而不是将“picture.jpg”显示为文本)。我不知道如何将这些函数传递给类。也许是这样的:

$ot->functions = array(null,null,'truncate','thumbnail');
但我不知道如何将这些字符串转换为运行一些实际代码,或者如何传递参数

一定有个好办法来做我想做的事。怎么做?

你要找的

然而,在运行时创建函数并将它们添加到类中,我觉得这不太合适。这很可能会很快成为维护的噩梦。有更好的方法来实现你想要的。函数将对数据进行何种操作?如何将它们存储在“tools”类中,并在需要时将其与表对象连接起来?

您正在寻找的

然而,在运行时创建函数并将它们添加到类中,我觉得这不太合适。这很可能会很快成为维护的噩梦。有更好的方法来实现你想要的。函数将对数据进行何种操作?将它们存储在“tools”类中,并在需要时将其与表对象连接如何?

$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。

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

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

如果要传递多个参数,请改用call\u user\u func\u数组。

PHP有一个,这实际上是一个难看的伪装闭包。您可以使用或调用此类回调:

PHP有一个简单的闭包,这实际上是一个丑陋的伪装闭包。您可以使用或调用此类回调:


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

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

选中此项,答案是:

从PHP5.3开始,可以使用闭包 或函子来传递方法 围绕在此之前,你可以写 一个匿名函数 ,但事实并非如此 相当尴尬

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

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
    }
}
通过这种方式,您可以添加无限过滤器。

检查此项,答案是:

从PHP5.3开始,可以使用闭包 或函子来传递方法 围绕在此之前,你可以写 一个匿名函数 ,但事实并非如此 相当尴尬

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

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
    }
}

通过这种方式,您可以添加无限过滤器。

正如Gordon正确指出的那样,PHP5.3现在的闭包不那么难看了。我已经完全忘记了它们,因为我现在坚持使用PHP5.2。正如Gordon正确指出的那样,PHP5.3现在已经没有那么难看的闭包了。我已经完全忘记了它们,因为我现在坚持使用PHP5.2.Wow,这是一个很棒的回复。非常感谢你!哇,真棒的回答。非常感谢你!