另一个函数中的PHP函数无法引用`$ this`

时间:2018-06-20 19:47:31

标签: php

我在函数内部有一个函数,而内部函数找不到外部类。我不知道为什么我希望有人对如何解决这个问题有所了解。我不想在外部函数之外声明内部函数。

class Foo {

    public $test = "test123";

    private function outerfunction(){

        function innerfunction(){

            echo $this->test;

        }

        innerfunction();

    }

}

如果我调用内部函数,则会收到错误Using $this when not in object context

3 个答案:

答案 0 :(得分:3)

只需将其重组为匿名函数:

$innerfunction = function () {
    echo $this->test;
}

$innerfunction();

然后将类上下文自动绑定到该函数(另请参见http://php.net/manual/en/functions.anonymous.php) 请注意,这仅适用于> = PHP 5.4

答案 1 :(得分:2)

您必须将其声明为变量,否则它将告诉您您不在对象上下文中:

    $innerfunction = function() {

        echo $this->test;

    };
    call_user_func($innerfunction);

或者,您可以像平时一样保留该函数,并将其传递给对象上下文,因为它在调用点是已知的:

    function innerfunction(/* Foo */ $obj) {

        echo $obj->test;

    };
    innerfunction($this);

答案 2 :(得分:1)

此方法最明显的问题是多次调用outerFunction()会产生:

  

致命错误:无法重新声明innerfunction()...

另一个问题是innerfunction()是在全局范围内声明的。如果这是故意的,那么这非常不合常规,您可能不应该这样做。无论如何,它允许这样做:

class Foo {

    public $test = "test123";

    public function outerfunction(){

        function innerfunction(){
            //echo $this->test;
        }

        innerfunction();
    }
}

$a = new foo();

// innerfunction(); // NOPE!
$a->outerFunction();
innerfunction(); // YES

因此,这是声明innerfunction()的逻辑方法:

class Foo {

    public $test = "test123";

    public function outerfunction(){
        $this->innerfunction();
    }

    private function innerfunction(){
        echo $this->test;
    }
}

$a = new foo();

$a->outerFunction();