从数组取值抛出ErrorException异常,求助显示数组事件键的方法
解决 "Trying to get property of non-object" 异常问题
看起来你在遍历PAMI返回的事件数组时踩了个小坑——这个异常说明你在尝试用对象属性的访问方式(->)去操作一个非对象的值,或者数组里混进了非对象元素。结合你给出的var_dump内容,我帮你拆解下问题和解决办法:
问题根源分析
从var_dump可以看到,events数组里的元素是PAMI\Message\Event\PeerEntryEvent类型的对象,但异常提示你在访问非对象的属性,大概率是这两种情况:
- 遍历
events数组时,其中某一个元素不是对象(比如是null、普通数组或者其他基础类型) - 你错误地混淆了数组和对象的访问语法,比如用
$event->key去访问数组元素,或者直接访问了对象的protected属性(比如rawContent)
正确的处理步骤
1. 遍历前先校验元素类型
在遍历events数组时,先确认每个元素是目标事件对象,避免直接访问非对象导致报错:
// 假设$response是你拿到的PAMI\ResponseMessage对象 foreach ($response->events as $event) { // 先校验是不是PeerEntryEvent对象(或者更通用的PAMI Event对象) if ($event instanceof \PAMI\Message\Event\PeerEntryEvent) { // 获取单个键值,比如event名称 $eventName = $event->getKey('event'); echo "事件名称:{$eventName}\n"; // 如果要获取这个事件的所有键值对 $allEventKeys = $event->getKeys(); foreach ($allEventKeys as $key => $value) { echo "{$key}: {$value}\n"; } } else { // 打印非对象元素,排查为什么会出现这个情况 echo "发现非对象元素:"; var_dump($event); } }
2. 不要直接访问protected属性
从var_dump里能看到rawContent、channelVariables这些是protected属性,不能直接用$event->rawContent访问,必须用PAMI对象提供的getter方法,比如getRawContent()或者getKey()来获取对应的值。
3. 排查数组中的非对象元素
如果上面的代码打印出了非对象元素,那你需要回溯下为什么events数组里会有非对象——可能是PAMI返回的响应中包含了其他类型的内容,或者你在处理数组时不小心修改了元素类型。
额外提示
PAMI的事件对象通常都实现了统一的方法来获取属性,比如:
getKey(string $name):获取单个指定键的值getKeys():获取所有键值对数组- 部分事件还有专属的getter方法,比如
getObjectName()来直接获取ObjectName属性值
内容的提问来源于stack exchange,提问作者Alan Spurlock
相关产品推荐
相关产品推荐

