Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.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:从全局函数访问封闭作用域_Php_Scope - Fatal编程技术网

PHP:从全局函数访问封闭作用域

PHP:从全局函数访问封闭作用域,php,scope,Php,Scope,我对一些PHP代码摸不着头脑。我不知道它是否在逻辑上工作,因为我对PHP还很陌生,由于语法错误,它还不会执行:语法错误,意外的“use”(t_use),预期为“{ 尽管PHP版本完全支持它,而且语法(据我所知)是正确的,但是语法错误在使用时出错了 代码检查指定了哪个数据库实现,它将为其中任何一个定义函数。因为我不能将从其他函数返回的函数定义为全局函数,所以我将其存储在变量中,通过全局函数“包装”访问从外部作用域捕获变量,或者至少它们应该我愿意 产生错误的两行已标记:- function quer

我对一些PHP代码摸不着头脑。我不知道它是否在逻辑上工作,因为我对PHP还很陌生,由于语法错误,它还不会执行:
语法错误,意外的“use”(t_use),预期为“{

尽管PHP版本完全支持它,而且语法(据我所知)是正确的,但是语法错误在使用
时出错了

代码检查指定了哪个数据库实现,它将为其中任何一个定义函数。因为我不能将从其他函数返回的函数定义为全局函数,所以我将其存储在变量中,通过全局函数“包装”访问从外部作用域捕获变量,或者至少它们应该我愿意

产生错误的两行已标记:-

function query_escaper($element_escaper) {
    return function($query, $values) use ($element_escaper) {
        return join(array_map(
            function($query_elem, $value) {
                return isset($value)
                    ? $query_elem . $element_escaper($value)
                    : $query_elem
                    ;
            },
            explode('?', $query),
            $values
        ));
    };
}

function define_postgresql_functions() {

    [...]

    $escape_query = query_escaper('pg_escape_literal');

    #
    # XXX The error occurs here :-
    #
    function escape_query() use ($escape_query) {
        return call_user_func_array($escape_query, func_get_args());
    }

    [...]
}

function define_mysql_functions() {

    [...]

    $escape_query = query_escaper(function($str) {
        return use_database(function($database) use ($str) {
            return $database->real_escape_string($str);
        });
    });

    #
    # XXX The same error also occurs here :-
    #
    function escape_query() use ($escape_query) {
        return call_user_func_array($escape_query, func_get_args());
    }

    [...]
}

switch ($database_info['type']) {
case 'postgresql':
    define_postgresql_functions();
    break;
case 'mysql':
    define_mysql_functions();
    break;
default:
    throw new DatabaseNotImplementedException();
}

我正在寻找两种可能的解决方案:要么能够从外部范围捕获这些变量,要么以另一种方式将全局函数定义为从其他函数返回的函数。

模式
function\s+\w+
总是在全局范围内声明函数,这意味着必须使用全局语法。这意味着如果正在创建闭包,则无法命名函数。因此这是无效的:

function escape_query()  use ($escape_query) {
但这很管用:

$escape_function = function() use ($escape_query) {
有几种不同的方法可以实现您想要的功能。
eval
就像在函数中使用静态变量或OOP解决方案一样

我认为OOP解决方案可能是最简单的:

class Escaper {

    public static $escape_function;
}


// in your function
Escaper::$escape_function = function() use ($escape_query) { //...

// later
Escaper::$escape_function('a','b','c');

你在运行什么版本的PHP?mkaatman,我在运行一个普通的5.4版本。mario,我已经疯狂地尝试使用括号,以免混淆解析器。啊,为了捕获封闭作用域,我需要闭包。我如何将闭包定义为全局函数?我用eval编写了一个讨厌的hack,但我宁愿做其他事情。。。