array_map()和使用array_map()的方法可以#[Pure]吗?

问题描述 投票:0回答:1

我有一个具有

#[Pure]
属性的函数,但是在我更改函数以在其中使用
array_map
后,PHPstorm 抱怨“该方法可能会产生副作用”。我还看到
array_map
没有标记为
#[Pure]
,我认为这与您无法对回调做出假设有关。在这种情况下,我的回调应该是纯回调,因为它只调用纯方法。有没有办法让 IDE 知道这个
array_map
是纯粹的,或者有没有办法我应该注释我的回调函数? 这是代码:

/**
 * @param array $msgArr
 * @return int
 */
#[Pure]  <== this one complains
public function getHighestNumericalCodeFromMessageArray(array $msgArr): int
{
    $numericalCodeArr = array_map(fn($msg) => $this->getNumericalCodeFromMessage($msg) % 99, $msgArr);
    return max($numericalCodeArr);
}

/**
 * @param string $msg
 * @return int
 */
#[Pure]
public function getNumericalCodeFromMessage(string $msg): int
{
    $trimmedMsg = trim($msg);
    if (is_numeric($trimmedMsg)) return (int)$trimmedMsg;
    $code = array_search($trimmedMsg, self::AVAILABILITY_MESSAGES, false);
    return $code !== false ? (int)$code : 0;
}
php phpstorm
1个回答
0
投票

尝试告知 IDE array_map 中的 lambda 函数是纯函数,您也可以使用 #[Pure] 属性显式注释 lambda 函数。但不确定 PHPStorm 是否会完全支持 lambda 的此属性,但您可以尝试以下方法:

#[Pure]
public function getHighestNumericalCodeFromMessageArray(array $msgArr): int
{
    $numericalCodeArr = array_map(
        #[Pure] fn($msg) => $this->getNumericalCodeFromMessage($msg) % 99,
        $msgArr
    );
    return max($numericalCodeArr);
}
© www.soinside.com 2019 - 2024. All rights reserved.