我正在使用HHVM编写一个系统工具,我不能在我的生活中找出为什么这个代码在我运行时发出错误hh_client
$__al_paths = array();
function requires(string $classPath): void {
global $__al_paths;
$className = basename($classPath);
if (!isset($__al_paths[$className])) {
$__al_paths[$className] = AL_CLASSES_FOLDER.'/'.$classPath.'.'.AL_CLASS_EXTENSION;
}
}
当我运行hh_client
/usr/lib/mango/tools/autoloader.hh:9:9,19: Expected
它指向的行是
行global $__al_paths;
在global
范围内声明了哪个。这似乎是一个语法错误,就好像HHVM上不支持global
关键字一样,但我检查了文档,并且它有几个在Hack代码中使用的示例。
答案 0 :(得分:4)
首先,当您编写PHP代码时,HHVM本身支持PHP语言的所有内容,包括global
。这种限制是由于您使用了Hack语言 - global
是我们从语言中删除的内容之一。如果你真的需要全局变量,你只能在部分模式下使用$GLOBALS
,但strict mode完全不允许它们。 (如果您使用global
看到我们的文档,那就错了,请使用页面上的按钮提交错误!)
答案 1 :(得分:1)
而不是使用global
尝试重写这样的代码(称为依赖注入):
function requires(string $classPath, $__al_paths): void {
$className = basename($classPath);
if (!isset($__al_paths[$className])) {
$__al_paths[$className] = AL_CLASSES_FOLDER.'/'.$classPath.'.'.AL_CLASS_EXTENSION;
}
}
然后称之为:
$__al_paths = array();
requires('classpath', $__al_paths);
通过这种方式,您可以生成比使用全局变量更灵活,更稳定的代码,而全局变量应该从每个人的头脑中删除。
答案 2 :(得分:0)
更新!!!
这似乎解决了这个问题,我想知道为什么global
关键字无效。
$__al_paths = array();
function requires(string $classPath): void {
$__al_paths = $GLOBALS['__al_paths'];
$className = basename($classPath);
if (!isset($__al_paths[$className])) {
$__al_paths[$className] = AL_CLASSES_FOLDER.'/'.$classPath.'.'.AL_CLASS_EXTENSION;
$GLOBALS['__al_paths'] = $__al_paths;
}
}