为了好玩,我试图让它能够为数组提供一些选项,然后将数组内爆成一个可以与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它实际上正在工作。我在这里做错了什么?
答案 0 :(得分: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']);
答案 1 :(得分: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);