在 PhpStorm 中,我收到有关非法数组键类型的警告,但我无法弄清楚
$size[$factor]
有什么非法内容。
非法数组键类型float
这是我的代码:
$size = array(' kB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB');
$factor = round((strlen($kbytes) - 1) / 3);
$sizereturn = sprintf("%.{$decimals}f", $kbytes / pow(1024, $factor)) . @$size[$factor];
$sizereturn = str_replace('.', ',', $sizereturn);
round()
函数返回浮点数。
数组元素访问的有效键应该是整数和字符串。
首先尝试将其投射到
int
,例如
$factor = (int)round((strlen($kbytes) - 1) / 3);
$size
数组是一个简单的数组,它有 0, 1, 2...,7
整数索引,并且您分配的索引是浮点数。首先使用类型转换将其转换为 integer
然后使用它。
为了完整起见,值得注意的是,这只是 PhpStorm 的一个功能,用于警告潜在的错误。 PHP 本身是一种松散类型的语言,不会抱怨或关心数组键类型只要它们是标量并且只会转换为正确的类型:
var_dump([
2.0 => 'Red',
3.1 => 'Green',
'Kittens' => 'Blue',
]);
class Foo
{
public function __toString()
{
return 'bar';
}
}
var_dump([
(string)new Foo() => 'This is valid too',
]);
var_dump([
new Foo() => 'Invalid key', // Warning: Illegal offset type
range(1, 2) => 'Invalid key', // Warning: Illegal offset type
new Datetime() => 'Invalid key', // Warning: Illegal offset type
]);
array(3) {
[2]=>
string(3) "Red"
[3]=>
string(5) "Green"
["Kittens"]=>
string(4) "Blue"
}
array(1) {
["bar"]=>
string(17) "This is valid too"
}
array(0) {
}
我认为铸造结果并不是最佳方法。 请改用 PHPDoc 注释:
/** @var int $factor
$factor = round((strlen($kbytes) - 1) / 3);