W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
類型檢查規(guī)則通常很簡單(例如,不能傳遞string給期望的內(nèi)容int)。然而,有一些規(guī)則有一些更高級的語義。
看看這個例子:
<?hh
namespace Hack\UserDocumentation\Types\AdvancedRules\Examples\SoftHint;
// HHVM will throw a warning instead of fatal if, for example, a bool is passed
// in
function foo(@int $x): bool {
return $x < 5 ? true : false;
}
function call_foo(): void {
foo(5);
foo(false);
}
call_foo();
Output
Warning: Argument 1 to Hack\UserDocumentation\Types\AdvancedRules\Examples\SoftHint\foo() must be of type @int, bool given in /data/users/joelm/user-documentation/guides/hack/20-types/08-advanced-rules-examples/softhint.php.type-errors on line 9
前面的“@”是什么意思?這導(dǎo)致HHVM在傳遞的參數(shù)不匹配時觸發(fā)警告(因此始終繼續(xù)執(zhí)行)而不是可捕獲的致命錯誤。它用于允許您慢慢添加類型到您的代碼。
軟類型提示對類型檢查器行為沒有影響。如果類型不匹配,類型檢查器仍然會拋出錯誤。
無論你目前在什么范圍內(nèi),Superglobals都可以使用。
<?hh
namespace Hack\UserDocumentation\Types\AdvancedRules\Examples\SuperGlobals;
function get_superglobal(string $s): array<string> {
// If you try to use a variable that doesn't exist (e.g., $_NOEXIST), the
// typechecker will thrown an undefined variable error.
switch ($s) {
case '_GET':
return $_GET;
break;
case '_ENV':
return $_ENV;
break;
case '_SERVER':
return $_SERVER;
break;
default: // not supporting anything else
return array();
}
}
function sg(string $s): array<string> {
return get_superglobal($s);
}
var_dump(is_array(sg('_SERVER')));
Output
bool(true)
類型檢查器知道內(nèi)置超幀。
在Hack的嚴(yán)格模式下,superglobals不支持。所以你必須創(chuàng)建一些類似部分模式的功能,以從嚴(yán)格的模式文件中調(diào)用。
可以使用將PSR-7暴露給Hack 的存儲庫來實(shí)現(xiàn)使用superglobals的不完美但可行的替代方案。這個repo中的HHI文件給出了關(guān)于接口的Hack類型檢查器信息。
Hack支持可變參數(shù):
function foo(<any explicit arguments>, int ...$args) // $args is a list of int arguments
類型檢查器將強(qiáng)制執(zhí)行可變類型,但是對于性能,運(yùn)行時不會。
<?hh
namespace Hack\UserDocumentation\Types\AdvancedRules\Examples\Variadic;
function foo(int ...$args): vec<int> {
$ret = vec[];
foreach ($args as $arg) {
$ret[] = $arg;
}
return $ret;
}
function bar(): void {
var_dump(foo(1, 2, 3, 4));
}
bar();
Output
vec(4){
int(1)
int(2)
int(3)
int(4)
}
switch言論中無意的跌倒是一個常見的錯誤。黑客提供了一種抓住突破的方法,增加了一種告訴它這是有意的方法。
<?hh
namespace Hack\UserDocumentation\Types\AdvancedRules\Examples\Fallthrough;
function fallthrough(int $x): void {
switch ($x) {
case 1: echo "1"; break; // without the break, typechecker throws an error
case 2: echo "2"; break;
case 3: echo "3"; break;
case 4: echo "4"; // but we can tell the typechecker we want it
// FALLTHROUGH
default: echo "5";
}
}
fallthrough(4);
Output
45
使用// FALLTHROUGH
要告訴我們的是通過故意落在typechecker。
Hack需要將類屬性在使用之前初始化為其適當(dāng)注釋類型的值。
父類定義一個方法,其子類覆蓋它。這很常見 Hack有一些關(guān)于重寫方法必須遵循的方法的規(guī)則。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: