2012-02-02 27 views
6
class example() 
{ 
    function shout($var) 
    { 
     echo 'shout'.$var; 
    } 

    function whisper($var, $bool) 
    { 
     if($bool) 
     { 
      echo $var; 
     } 
    } 
} 

$obj = new example(); 

if($var) 
{ 
    $func = $obj->shout(); 
}else 
{ 
    $func = $obj->whisper(); 
} 

ループに条件を入れるのではなく、後で使用するために関数変数を最初に準備する必要があります。可能な方法はありますか?オブジェクト関数を変数に割り当てる方法は?

+0

ささやき/叫びは/ etcに引数を指定して慎重に。あなたは羽ばたきのような火で遊んでいます。 – landons

+0

@landons私はどのように "quacks-like-a-duck"火があるのか​​見ていません。それを考えれば(PHP)はすべて動的に型指定されていると考えています... –

+0

@landons本当ですか?私はそれに気付かなかったhehe – kaz

答えて

4

あなたは、文字列内の関数名を置くことができますコールバックを使用する:

if($var) 
{ 
    $func = array($obj, 'shout'); 
}else 
{ 
    $func = array($obj, 'whisper'); 
} 

以降:

call_user_func($func); 

か:

call_user_func_array($func, $args); 
+0

@notJim、どちらをお勧めしますか? – kaz

+0

@pst:これは[the php manual](http://php.net/manual/en/language.pseudo-types.php)によるコールバックです。 @kaz:いずれにしても強い意見はありません。 '$ obj - > $ func'を使うのは、他の関数に渡す必要がない限り、私は通常それを使います。 – notJim

+0

@notJimそれはちょっとした舌のようなものでした。私は代わりに、(2番目のアプローチ)「メソッドを名前で呼び出すための情報のタプル」であり、ファーストクラスではないことを強調しておきたいと思います値(またはコールバック関数):) –

6

は、名前のメソッドを呼び出すことができます。後で

if($var) 
{ 
    $func = 'shout'; 
}else 
{ 
    $func = 'whisper'; 
} 

$obj->$func 

することができます

if ($var) { 
    $fn = 'shout'; 
} else { 
    $fn = 'whisper'; 
} 

$obj->$fn(); 
+3

可能ですが、これは技術的に質問するものではありません:-) RubyとPythonでは「バインドされたメソッド」(オブジェクトコンテキストに関連付けられた関数)を取得することができますが、C#にはデリゲートに変換可能なメソッドグループ(この場合はオブジェクトコンテキストにも関連付けられています)があります。 PHPにこのような概念はありますか? (Say、5.3) –

+0

@pst私はバインドされたメソッドのPHPの対応はないと思う - 私たちはそれを探しています。 PHPは本当に古い言語ですが、プログラマが多くの作業を行うことができる柔軟性があるため、私たちは幸いです。 – kaz

+0

@pst:ありません。 PHP 5.3のリリースまでには、関数オブジェクト_at all_を持っていなかったのですが、 'create_function'はgensymを返しています。そして、それらを使っても、様々な定義された関数の関数オブジェクトを得る方法はありませんバインドされたメソッド – duskwuff

関連する問題