0

我有这段代码,它是我用来确定给定字符串是否是保留的 PHP 关键字的函数的一部分(因为 PHP 没有内置的函数):

$tokens = token_get_all('<?php ' . $string . '; ?>');

if (is_array($tokens))
    return reset($tokens[1]) !== T_STRING; // Madness...

它使 PHPStan 吠叫:

参数 #1 $array of function reset 需要给出 array|object, array<int, int|string>|string。

我不知道为什么,但希望错误消失,所以我试图“展开”这条紧凑的线路,但我意识到我不明白它在做什么。你能解释一下并帮助我吗?我经常发现将事情分成单独的行/操作会使 PHPStan 停止吠叫。

4

1 回答 1

0

PHPStan 正确地将您的代码标记为错误。在您的示例$tokens中始终是一个数组,因为这就是token_get_all返回的内容。

也许您打算迭代$tokens并检查迭代值的类型,如下所示:

$tokens = token_get_all('<?php ' . $string . '; ?>');

foreach ($tokens as $t) {
    \PHPStan\dumpType($t); // array{int, string, int}|string
    if (is_array($t)) {
        \PHPStan\dumpType($t); // array{int, string, int}
        return $t[0] !== T_STRING; // this was the intended logic?
    }
}

PHPStan 操场上的示例:https ://phpstan.org/r/63db568c-94d2-4c5f-bc7b-611448d4a96c

于 2022-02-25T12:28:20.563 回答