PHP/Scope/Callback

Fab*_*ien 4 php scope callback

class myClass {$ myVariable ='myCallback';

    function myFunction() {
        $body = false;
        $callback = $this->myVariable;

        function test($handle, $line) {
            global $body, $callback;

            if ($body) {
                call_user_func($callback, $line);
            }

            if ($line === "\r\n") {
                $body = true;
            }

            return strlen($line);
        }

        ...
        curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'test');
        ...
    }
}

function myCallback($data) {
    print $data;
}

$myCls = new myClass();
$myCls->myFunction();
Run Code Online (Sandbox Code Playgroud)

警告:call_user_func()[function.call-user-func]:第一个参数应该是一个有效的回调!

我的$回调值为空,如何解决此问题?限制:myCallback功能无法更改!

Fel*_*ing 10

重要提示:这仅适用于PHP> = 5.3.OP不使用PHP 5.3,但我会在这里留下答案,以防有人遇到类似问题并使用PHP 5.3.


$callback不是全局变量,它在方法范围内是本地的.从文档:

闭包还可以从父作用域继承变量.必须在函数头中声明任何此类变量.从父作用域继承变量与使用全局变量不同.全局变量存在于全局范围内,无论执行什么功能,它都是相同的.闭包的父作用域是声明闭包的函数(不一定是从中调用它的函数).

利用use(并将函数赋值给变量):

$test = function($handle, $line) use ($callback, $body){

    if ($body) {
        call_user_func($callback, $line);
    }

    if ($line === "\r\n") {
        $body = true;
    }

    return strlen($line);
};
Run Code Online (Sandbox Code Playgroud)

然后:

curl_setopt($ch, CURLOPT_WRITEFUNCTION, $test);
Run Code Online (Sandbox Code Playgroud)

  • @Fabien:让你的测试函数成为MyClass中的一个方法 (2认同)