Hack typechecker没有认识到全球的'函数内的关键字

时间:2014-10-03 10:16:26

标签: php hhvm hacklang

我正在使用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代码中使用的示例。

3 个答案:

答案 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;
    }
}