描述PHP Cannot use assign-op operators with string offsets | Illegal string offset
PHP5.4中一个需要注意的变化(Chained string offsets) , 这个坑容易被踩到;
描述:当对于一个变量name,如果name, 如果name,如果name是一个字符串, 那么, 对于非数字型索引, 比如name[′age′],在isset的时候将返回false,empty返回true,但是为了兼容已有的代码,当你获取这个值的时候,还是会返回name['age'], 在isset的时候将返回false, empty返回true, 但是为了兼容已有的代码,
当你获取这个值的时候, 还是会返回name[′age′],在isset的时候将返回false,empty返回true,但是为了兼容已有的代码,当你获取这个值的时候,还是会返回name[0], 不过会额外抛出一个警告信息.
$name = "leyangjun";
var_dump($name["age"]);
//输出:string(1) "l" -->(同时会有个警告(非法字符串偏移量):Warning: Illegal string offset 'age' in /usercode/file.php on line 3)
//而键值是bool, double, null的情况, 将会和以前保持一致, 不过会抛出一个Notice信息.
var_dump(isset($name["age"]));//输出:false
var_dump(empty($name["age"]));//输出:true
项目实际例子
if (!empty($polymerizeData)) {
foreach ($polymerizeData as $rKey => $rVal) {
foreach ($rVal as $iKey => $iVal) {
$ret[$rKey]['submit_date'] = date('Y-m', time()));
$ret[$rKey]['wx_amount'] += $iVal['wx_amount'] / 100;
$ret[$rKey]['alipay_amount'] += $iVal['alipay_amount'] / 100;
//$iVal['google_play_amount'],存储的是个json
$googlePlayAmount = json_decode($iVal['google_play_amount'], true);
if (!empty($googlePlayAmount)) {
foreach ($googlePlayAmount as $gKey => $gVal) {
//此处:会抛出一个waring -->{\"code\":0,\"message\":\"Cannot use assign-op operators with string offsets\",\"file\":\"\\/leyangjun\\/Applications\\/leyangjun.php\",\"line\":67"}
$ret[$rKey]['google_play_amount'][$gKey] += $gVal;
}
}
}
}
解决办法,对数据类型做下初始化即可
if (!empty($polymerizeData)) {
foreach ($polymerizeData as $rKey => $rVal) {
foreach ($rVal as $iKey => $iVal) {
$ret[$rKey]['google_play_amount'] = isset($ret[$rKey]['google_play_amount']) ? $ret[$rKey]['google_play_amount'] : [];//初始化默认值
$ret[$rKey]['submit_date'] = date('Y-m', time()));
$ret[$rKey]['wx_amount'] += $iVal['wx_amount'] / 100;
$ret[$rKey]['alipay_amount'] += $iVal['alipay_amount'] / 100;
//$iVal['google_play_amount'],存储的是个json
$googlePlayAmount = json_decode($iVal['google_play_amount'], true);
if (!empty($googlePlayAmount)) {
foreach ($googlePlayAmount as $gKey => $gVal) {
$ret[$rKey]['google_play_amount'][$gKey] = (isset($ret[$rKey]['google_play_amount'][$gKey]) ? $ret[$rKey]['google_play_amount'][$gKey] : 0) +$gVal;
}
}
}
}
总结
由于PHP是个弱类型语言,在写代码逻辑时最好都做下严谨判断
探讨PHP5.4中处理字符串偏移时的常见错误,如使用非数字索引时isset和empty的行为变化,及如何通过初始化解决警告问题。
1万+

被折叠的 条评论
为什么被折叠?



