2

为了好玩,我试图让它能够为数组提供一些选项,然后将数组内爆成一个可以与 WideImage 类一起使用的字符串。但我遇到了麻烦。好像实际上是不可能的。

我的代码如下:

$options = array('resize'=>'50,50');

$actions = implode('->', $options);
$img = WideImage::load($image) . $actions . ';';

这将使字符串如下:

WideImage::load('../images/photo.jpg')->resize(50,50);

我从你们那里寻找的是告诉我这是否可能。

更新

当我使用 eval() 时,我收到一个错误,即提供给 wideimage 类的方法是未定义的属性。

这是我的代码:

$actions = 'resize(50,50)';
return eval('WideImage::load($image)->$actions->saveToFile('path/to/file')');

这给了我一个未定义属性的错误,并说 saveToFile() 是非对象的成员。但是,如果我对调整大小进行硬编码并且不使用 $actions 它实际上正在工作。我在这里做错了什么?

4

2 回答 2

2

call_user_func_array 非常适合这个,但你需要重构一些东西。

$options = array('method' => 'resize', 'parameters' => array(50, 50));
$obj = WideImage::load($image);
call_user_func_array(array($obj, $options['method']), $options['parameters']);
于 2013-01-25T23:55:30.787 回答
0

你是关于方法链的。是的,有可能。首先,您必须通过创建新对象来更改静态调用,然后每个方法都必须返回该对象。在你的例子中:

<?php
class WideImage
{
    public function load($filepath){
        // your code
        return $this;
    }
    public function resize($width, $height){
        // your code
        return $this;
    }
}
$objWide = new WideImage();
$objWide -> load('../images/photo.jpg') -> resize(50,50);
于 2013-01-25T23:57:19.333 回答