2011-12-16 20 views
5

実行時にクラス変数に関数を割り当てることは可能ですか? (合計がAの範囲外であるが、これは私が意味するパターンであるので、これは動作しません)phpの実行時にクラス変数に関数を割り当てることは可能ですか?

class A { 
    public $function_name; 
    public functon run($arg1,$arg2){ 
     $function_name($arg1,$arg2); 
    } 
} 

function sum($a,$b){ 
    echo $a+$b; 
} 

$a=new A(); 
$a->function_name='sum'; 

$a->run();  

[編集:C

このような何かのような「関数ポインタ」の種類] i「がcall_user_func」がある知っているが、私はcall_user_func_array使用してパブリッククラスメソッド

+0

[PHPオブジェクトに新しいメソッドを追加する方法は?](http://stackoverflow.com/questions/2938004/how-to-add-a-new-method-to-a -php-object-on-the-fly) – mario

答えて

3

あなたはPHP> 5.3.0を使用する場合anonymous functionを使用することができます。

$sum = function($a, $b) { 
    return $a+$b; 
} 

$a->function_name = $sum; 
2

のスコープ内の関数を持っているか、使用することを理解し、それは必要があります。

<?php 
class A { 

    public $function_name; 

    public function run($arg1,$arg2){ 

     return call_user_func_array($this->function_name, array($arg1, $arg2)); 

    } 
} 

function sum($a,$b){ 
    return $a+$b; 
} 

$a=new A(); 
$a->function_name= 'sum'; 

var_dump($a->run(1,1)); //2 

?> 
+0

クール!しかし、私は関数の宣言とクラスの初期化は同じスコープにある必要がありますか? – Zorb

+0

@ Zorb、あなたはどういう意味ですか、合計はクラスAのパブリックメソッドですか? – Esailija

+0

あなたはここで 'call_user_func_array()'を誤って使うことができます...あなたが単に 'call_user_func()'を使うべきパラメータを知っていれば、そうでなければ、 '$ args = func_get_args();を実行します。既知のパラメータから配列を作成する代わりに、call_user_func_array($ this-> function_name、$ args); – rdlowrey

1

スコープに関係なく動作します。あなたはcall_user_funcを使って呼び出すだけです。私はあなたの例でいくつかのタイプミスを修正しました。

<?php 
    class A { 
     public $function_name; 
     public function run($arg1, $arg2) { 
     call_user_func($this->function_name, $arg1, $arg2); 
     } 
    } 

    function sum($a, $b){ 
     echo $a + $b; 
    } 

    $a = new A(); 
    $a->function_name = 'sum'; 

    $a->run(2, 3); 
?> 

Live example

0

を別の方法は、(メソッドをオブジェクトに適用可能)使用変数変数

を作ることです
public static function sum($arg1, $arg2) 
{ 
    .. 
} 

public function run($arg1, $arg2) 
{ 
    $func = $this->function_name; 
    $func($arg1, $arg2);   <-- procedural call 
    self::$func($arg1, $arg2); <-- static method call 
} 
0

Callback p seudoタイプ。 と一緒に使用call_user_funcまたはcall_user_func_array

このマニュアルは、上記の使用例を示しています。

$ thisキーワードを簡単に使用できるようにしたい場合は、新しいPHP 5.4 Closure::bindTOメソッドも参照してください。

関連する問題