2014-10-03 12 views
4

我使用HHVM写一个系统工具的功能内“全局”的关键字,我不能为我的生活弄清楚为什么这个代码发出一个错误,当我运行hh_client哈克typechecker不承认

$__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代码中使用的例子。

+3

我觉得你很有趣如何使用hacklang和HHVM,但你仍然设法产生可怕的代码。如果要继续使用全局变量和不可读的变量名称等糟糕的做法,那么使用允许严格打字的语言有什么意义? – 2014-10-03 10:27:44

回答

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; 
    } 
} 
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); 

你产生更灵活的这种方式和更稳定的代码比玩的应该从每个人的头脑中删除的全局。

4

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

+0

谢谢乔希,那完美地回答了我的问题!它非常有意义。 – 2014-10-05 09:23:08