2016-04-13 8 views
2

PHP anonymous function assigned to class property in constructor is always null?と似たようなことをしようとしていますが、私の解決策はもっと簡単に思えます。私は、このソリューションのスタックオーバーフローホットショットからのコメントと、より良いものがあるかどうかを知りたかったのです。これは「ベストプラクティス」問題のようなものです。クラスのプロパティに関数を割り当てる

私はクラス/オブジェクトに関数(匿名または定義済み)を渡し、その関数を後で呼び出すことができます。これが実行されると

function Foo($arg) {return sprintf('In Foo(%s)',$arg);} 
function Bar($arg) {return sprintf('In Bar(%s)',$arg);} 

class TestIt { 
    private $func; 

    public function __construct($func) { $this->func = $func; } 

    public function OutPut($arg) { 
    return $this->func($arg); 
    } 
} 

$test = new TestIt('Foo'); 
echo $test->OutPut('Bozo'); 

、私はこの方法$this->funcが存在しないというエラーが出ます:私はこれを始めています。 is_callableテストをメソッドOutPut()に入れた場合、実際には$this->funcは呼び出し可能ですが、エラーはそのままです。

私はis_callableという3番目の引数を使用しても、うまく動作します。

public function OutPut($arg) { 
    return is_callable($this->func,false,$tmpfunc) ? $tmpfunc($arg) : null; 
} 

これはどのように解決策として組み立てられますか?あなたの考えが不思議です。

+0

'__construnt'はあなたの質問の誤植ですか、それともあなたのコードにもありますか? – dan08

+0

入力ミスが修正されました。ありがとう。 – Kiser

+0

あきらめましたか? – AbraCadaver

答えて

2

PHPは変数関数として$this->func()を解析するために取得する方法がないので、あなたはここで2つのオプションがあります。

return call_user_func_array($this->func, array($arg)); 

または:

$func = $this->func; 
return $func($arg); 

is_callable()を静的メソッド呼び出しを返しますsomeClass::someMethodたとえ静的メソッドでなくオブジェクトスコープで呼び出されても、

+0

ありがとうございます。私はcall_user_func_arrayのソリューション、またはエラーチェックのためのis_callableを持つ私のソリューションを好む。これら2つのソリューションのパフォーマンスに違いはありますか? – Kiser

+0

ベンチマークできますが、 'is_callable'には少しオーバーヘッドがあり、呼び出し可能な名前は常に静的な名前です(editを参照)。 – AbraCadaver

関連する問題