我正在抓住一些PHP代码。我不知道它是否在逻辑上有效,因为我对PHP很新,并且由于语法错误而无法执行它:syntax error, unexpected 'use' (T_USE), expecting '{'
语法错误在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();
}
我正在寻找两种可能的解决方案:要么能够从外部范围捕获这些变量,要么将全局函数定义为从其他函数返回的函数。
答案 0 :(得分: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');