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 is perfect for this, but you would need to refactor a few things.

$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 に答える