本节书摘来自华章出版社《Hack与HHVM权威指南》一书中的第1章,第1.5.1节,作者 Owen Yamauchi,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.5.1 使用超级全局变量
超级全局变量是在每个代码范围内都存在的全局变量,不需要使用global语句即可使用。这些在运行环境中特殊存在的变量一共有9个,分别是:
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
在Hack的严格模式下,并不支持超级全局变量。如果你试图使用它们中的某一个,类型检查器将会告诉你这个变量未定义。然而在通常的Web应用或者脚本的编写过程中,这些超级变量又是不可或缺的。
要解决上述问题,你能够做的最简单的办法就是,在一个局部模式的文件下编写访问器函数,然后在严格模式下的文件中调用。
function get_params(): array {
return $_GET;
}
function env_vars(): array {
return $_ENV;
}
// ...
这样的方式对你代码的类型安全不会有任何贡献。然而,我们还可以做得更好。特别是对于HTTP的GET和POST参数来说,你经常知道所期待的值的类型,所以你可以根据这个知识点来得到更加强健的代码:
function string_param(string $key): ?string {
if (!array_key_exists($_GET, $key)) {
return null;
}
$value = $_GET[$key];
return is_string($value) ? $value : null;
}
// 或者选择下面的增强版:如果类型错误将抛出异常
function string_param(string $key): ?string {
if (!array_key_exists($_GET, $key)) {
return null;
}
$value = $_GET[$key];
invariant(is_string($value), 'GET param must be a string');
return $value;
}
我们将在1.7节更加详细地了解invariant()函数的使用方法。目前来说,我们仅仅需要知道如果第一个参数是false,它将会抛出一个异常。
针对其他的超级全局变量和值类型,你还可以编写类似的访问器代码。