动态添加方法到对象

时间:2013-01-25 22:46:57

标签: php

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

2 个答案:

答案 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);