2

我有以下 PHP 类,其中包含许多其他以应用程序为中心的函数,my_new_iterative_function()但是当我进入(我需要foreach的)范围时,由于上下文而变得无效。传递的正确方法是什么,以便它在and内部有效。$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 回答