我在一些PHP代碼中摸不着頭腦。我不知道它是否在邏輯上還能正常工作,因爲我對PHP很陌生,並且由於語法錯誤而無法執行:syntax error, unexpected 'use' (T_USE), expecting '{'
PHP:從全局函數訪問封閉範圍
語法錯誤在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();
}
我找了兩個可能的解決方案:要麼能夠捕獲來自外部範圍的變量,或者定義全局功能的另一種方式從其他函數返回的函數。
您運行的是什麼版本的PHP? – mkaatman 2013-03-10 03:11:22
mkaatman,我正在運行5.4的香草副本。 馬里奧,我已經瘋狂與trialling括號,以免混淆解析器。 – ljackman 2013-03-10 03:12:55