描述PHP Cannot use assign-op operators with string offsets | Illegal string offset
PHP5.4中一个需要注意的变化(Chained string offsets) , 这个坑容易被踩到;
描述:当对于一个变量
n
a
m
e
,
如
果
name, 如果
name,如果name是一个字符串, 那么, 对于非数字型索引, 比如
n
a
m
e
[
′
a
g
e
′
]
,
在
i
s
s
e
t
的
时
候
将
返
回
f
a
l
s
e
,
e
m
p
t
y
返
回
t
r
u
e
,
但
是
为
了
兼
容
已
有
的
代
码
,
当
你
获
取
这
个
值
的
时
候
,
还
是
会
返
回
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是个弱类型语言,在写代码逻辑时最好都做下严谨判断