PHP7按负数进行位移位将在PHP中引发算术错误
我们希望切换到PHP7服务器,并对网站的现有代码进行兼容性检查。发现的问题之一是以下函数和按位负数移位 显然,这将在PHP7中抛出错误。我承认我不完全理解这个算法是如何工作的,但我想知道是否有人对如何修改该函数提出了建议,以#1维护该功能并#2使其符合PHP7PHP7按负数进行位移位将在PHP中引发算术错误,php,bitwise-operators,php-7,Php,Bitwise Operators,Php 7,我们希望切换到PHP7服务器,并对网站的现有代码进行兼容性检查。发现的问题之一是以下函数和按位负数移位 显然,这将在PHP7中抛出错误。我承认我不完全理解这个算法是如何工作的,但我想知道是否有人对如何修改该函数提出了建议,以#1维护该功能并#2使其符合PHP7 /** * Right shift with zero fill. * * @param integer $a number to shift * @param integer $b number of bits to shift
/**
* Right shift with zero fill.
*
* @param integer $a number to shift
* @param integer $b number of bits to shift
* @return integer
*/
public function zeroFill($a, $b){
return ($a >= 0) ? ($a >> $b) : ($a >> $b) & (PHP_INT_MAX >> ($b - 1));
}
当数学计算没有按正常预期进行时,就会抛出算术错误,在这种情况下,可能会导致数值超出整数的可能边界。() 您的函数已经在验证这一点并限制PHP_INT_MAX的操作,因此没有问题 要删除验证插件抛出的警报消息,需要使用try/catch块覆盖函数,以捕获可能的算术错误。这样,函数将类似于:
public function zeroFill($a, $b){
try {
return ($a >= 0) ? ($a >> $b) : ($a >> $b) & (PHP_INT_MAX >> ($b - 1));
} catch(ArithmeticError $error) {
// Do your logic to treat this kind of error
}
return $a; // Or return something you would want
}
此外,使用stru焊盘始终是一个不错的选择。查找stru焊盘函数,也许您可以使用它来解决问题