0

PHPコードで頭を悩ませています。私はPHPにまったく慣れておらず、構文エラーのためにまだ実行されないため、論理的に機能するかどうかはまだわかりません。syntax error, unexpected 'use' (T_USE), expecting '{'

PHPバージョンが完全にサポートしているにもかかわらず、構文エラーが発生しuse、構文は(私が知る限り)正しいです。

このコードは、どのデータベース実装が指定されているかをチェックし、それがどちらであっても関数を定義します。他の関数から返された関数をグローバル関数として定義することはできないため、関数を変数に格納し、外部スコープから変数をキャプチャするグローバル関数を介してアクセスを「ラップ」するか、少なくともそうする必要があります。

エラーが発生した 2 行がマークされています。

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();
}

私は 2 つの可能な解決策を探しています。外部スコープからこれらの変数をキャプチャできるか、またはグローバル関数を他の関数から返される関数として定義する別の方法です。

4

1 に答える 1

1

パターン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');
于 2013-03-10T03:12:01.477 に答える