黑客类型检查器无法识别';global';关键字


Hack typechecker not recognising 'global' keyword inside a function

我正在使用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;
    }
}