我正在使用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
作用域中声明。这似乎是一个语法错误,似乎global
关键字在HHVM上不受支持,但我查看了文档,它有几个在Hack代码中使用的例子。
首先,在编写PHP代码时,HHVM本身支持从PHP语言到global
的所有内容。这个限制是由于您使用了Hack语言——global
是我们从该语言中删除的内容之一。如果您真的需要全局变量,您可以只在部分模式下使用$GLOBALS
,但严格模式完全不允许使用它们。(如果您看到我们使用global
的文档,它是错误的,请使用页面上的按钮来提交错误!)
不要使用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);
通过这种方式,你可以生成比玩全局变量更灵活、更稳定的代码,而全局变量应该从每个人的脑海中删除。
UPDATE!!!
这似乎解决了问题,我想知道为什么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;
}
}