Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
另一个函数中的PHP函数无法引用`$this`_Php - Fatal编程技术网

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

另一个函数中的PHP函数无法引用`$this`,php,Php,我在函数中有一个函数,而内部函数找不到外部类。我不知道为什么。我希望有人知道我如何解决这个问题。我不想在外部函数之外声明内部函数 class Foo { public $test = "test123"; private function outerfunction(){ function innerfunction(){ echo $this->test; } innerfunction(

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

class Foo {

    public $test = "test123";

    private function outerfunction(){

        function innerfunction(){

            echo $this->test;

        }

        innerfunction();

    }

}

如果调用内部函数,则在不在对象上下文中时使用$this会出现错误。

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

    $innerfunction = function() {

        echo $this->test;

    };
    call_user_func($innerfunction);
或者,您可以保持函数不变,并将对象上下文传递给它,因为它在调用点是已知的:

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

        echo $obj->test;

    };
    innerfunction($this);

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

    $innerfunction = function() {

        echo $this->test;

    };
    call_user_func($innerfunction);
或者,您可以保持函数不变,并将对象上下文传递给它,因为它在调用点是已知的:

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

        echo $obj->test;

    };
    innerfunction($this);

只需将其重新构造为匿名函数:

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

$innerfunction();
然后,类上下文将自动绑定到函数,请参见
请注意,这只适用于>=PHP 5.4

只要将其重新构造为匿名函数:

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

$innerfunction();
然后,类上下文将自动绑定到函数,请参见
请注意,这只适用于>=PHP 5.4

此方法最突出的问题是多次调用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的逻辑方法:


这种方法最突出的问题是多次调用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的逻辑方法:


因此,将其作为参数传入我不能将其用作默认参数,并且我不希望每次都将其包含在函数中您不太可能在类中使用内部函数。这些函数很可能是类本身中的私有函数或受保护函数。因此,将其作为参数传入我不能将其用作默认参数,并且我不希望每次都将其包含在此函数中。您不太可能在类中使用内部函数。这些函数更有可能是类本身中的私有函数或受保护函数。