4

我正在使用 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范围内声明的。这似乎是一个语法错误,好像globalHHVM 不支持该关键字,但是我检查了文档,它有几个在 Hack 代码中使用的示例。

4

3 回答 3

4

首先,当您编写 PHP 代码时,HHVM 本身支持 PHP 语言中的所有内容,包括global. 此限制是由于您使用了 Hack 语言——global这是我们从该语言中删除的内容之一。如果你真的需要全局变量,你只能$GLOBALS在部分模式下使用,但严格模式完全不允许它们。(如果您看到我们的文档使用global是错误的,请使用页面上的按钮提交错误!)

于 2014-10-03T15:35:59.887 回答
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);

通过这种方式,您可以生成更灵活、更稳定的代码,而不是玩弄应该从每个人的脑海中删除的全局变量。

于 2014-10-03T10:23:31.630 回答
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;
    }
}
于 2014-10-03T10:23:23.283 回答