PHP 8.3中对象转数组不自动过滤null或空属性,需显式处理:优先用get_object_vars()获取public属性,必要时用ReflectionClass读取私有/受保护属性,过滤时仅排除===null和==='',避免误删0、false等合法值。

PHP 8.3 中对象转数组本身不会自动过滤 null 或空属性,必须显式处理。关键在于:先安全地把对象转成数组,再对数组执行精准过滤——不能依赖默认行为,尤其要避开 array_filter() 不传回调时误删 0、false 等合法值的问题。
用 get_object_vars() 获取公共属性(最常用)
适用于标准 Model 类,只含 public 属性:
- 调用
get_object_vars($obj)得到关联数组,仅包含已声明的 public 属性及其当前值 - 它不处理 private/protected 属性,也不触发动态属性警告,兼容 PHP 8.3 的严格模式
- 后续可直接对返回数组使用
array_filter()配合自定义条件
用反射获取全部属性(含私有和受保护)
当对象有 private 或 protected 属性,且你需完整状态时必须用 ReflectionClass:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 创建
$ref = new ReflectionClass($obj),调用getProperties() - 遍历每个属性,用
$prop->setAccessible(true)读取值,再判断是否为null或空字符串 - 注意:PHP 8.3 下对未标注
#[AllowDynamicProperties]的类写入动态属性会触发弃用警告,但读取不受影响
过滤时区分“真空”和“有效假值”
避免用默认 array_filter($arr),它会删掉 0、false、[] —— 这些可能是业务合法值:
- 只去
null和空字符串:array_filter($arr, fn($v) => $v !== null && $v !== '') - 若还需排除空数组,加判断:
&& !is_array($v) || !empty($v) - 最后建议调用
array_values()重置索引(如需数字键),或保留原键名(如为关联结构)
封装成可复用方法(推荐)
把转换 + 过滤逻辑收拢,便于维护和统一行为:
- 函数接收对象和一个“是否忽略 null/空字符串”的开关参数
- 内部优先用
get_object_vars();如需私有属性,再 fallback 到反射 - 过滤条件明确限定为
=== null或=== '',不碰0、false等 - 返回前可选是否保持原始键名,避免后续遍历时出错
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










