2

次のPHPクラスには、他にも多くのアプリ中心の関数が含まれていますが、スコープmy_new_iterative_function()に入ると(必要な)、コンテキストが原因で無効になります。との内部で有効になるようにを渡す正しい方法は何ですか。foreach$this$thismethod_foomethod_bar

注:これはより複雑な問題の一部であり$fallback_order、デフォルトの順序で関数を実行しますが、my_new_iterative_function()実行の順序(配列の目的)を制御するために配列を受け入れる必要があります$order_functions

class Foo {
    public function my_new_iterative_function(array $fallback_order = array('method_foo', 'method_bar')) {

        $order_functions = array(
            'method_foo' => function(){
                // need to access $this
            },
            'method_bar' => function(){
                // need to access $this
            },
        );

        foreach ( $fallback_order as $index => $this_fallback ) {
            $order_functions[$this_fallback]();
        }
    }
}
$instance_of_foo->my_new_iterative_function(); 
$instance_of_foo->my_new_iterative_function([ 'method_bar', 'method_foo', ]); 
4

3 に答える 3

3

$thisそれらはfooクラスに属していないため、これらの関数を使用することはできません。これらは、fooクラスによって呼び出される単なる無名関数です。匿名関数内からクラスのメンバーにアクセスする必要がある場合は、次の$thisように渡す必要があります:

    $order_functions = array(
        'method_foo' => function($obj){
            // need to access $this using $obj instead
        },
        'method_bar' => function($obj){
            // need to access $this using $obj instead
        },
    );

    foreach ( $fallback_order as $index => $this_fallback ) {
        $order_functions[$this_fallback]($this);
    }
于 2012-10-15T18:23:24.447 に答える
1

最も簡単な答えは$this、引数として渡すことです。

$order_functions[$this_fallback]($this);

次に、次のことを行う必要があります。

$order_functions = array(
            'method_foo' => function($myObj){
                // use $myObj $this
            },
            'method_bar' => function($myObj){
                // user $myObj instead of $this
            },
        );

$thisこれらの関数はクラスインスタンスの一部ではないため、クラスインスタンス内にあるように、実際にこれらの関数内で使用することはできません。したがって、これらの関数内のインスタンスから使用する必要のあるすべてのプロパティまたは関数に対して、何らかのパブリックアクセサーがあることを確認する必要があります。

于 2012-10-15T18:25:36.457 に答える
0

$this私が見る唯一の方法は関数に渡すことです

$order_functions = array(
    'method_foo' => function(Foo $foo){
        $foo->somePublicFunction();
    },
);

$order_functions[$this_fallback]($this);

ただし、Fooインスタンスでのみパブリック関数を呼び出すことができます...ニーズに合っている場合はわかりません。

于 2012-10-15T18:26:34.627 に答える