PHP 7.5不存在,最新稳定版是PHP 8.3;获取protected属性值推荐用ReflectionClass(需setAccessible(true)),或在类中定义toArray()方法。

PHP 7.5 并不存在 —— PHP 官方最新稳定版本截至 2024 年是 PHP 8.3,PHP 7 系列的最终版本是 PHP 7.4(已于 2022 年 11 月停止支持)。
如果你实际使用的是 PHP 7.4 或 PHP 8.x,且目标是获取对象中受保护(protected)属性的值并转为数组,以下是几种安全、合规、实用的方法:
✅ 使用 `get_object_vars()`(仅限 public 属性)
注意:`get_object_vars($obj)` 只返回对象的 public 属性,对 `protected` 和 `private` 属性返回空数组或忽略。所以它不满足“获取 protected 属性”的需求,仅作对比说明。
✅ 使用反射(ReflectionClass)—— 推荐方案
这是获取 `protected`(及 `private`)属性值的标准方式,兼容 PHP 7.4+ 和所有 PHP 8.x 版本。
function objectToAssocArray($obj) {
$reflection = new ReflectionClass($obj);
$props = $reflection->getProperties(ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PUBLIC);
$result = [];
foreach ($props as $prop) {
$prop->setAccessible(true); // 绕过访问控制
$result[$prop->getName()] = $prop->getValue($obj);
}
return $result;
}
// 示例
class User {
public $name = 'Alice';
protected $age = 30;
protected $email = 'alice@example.com';
}
$user = new User();
var_dump(objectToAssocArray($user));
// 输出:
// array(3) {
// ["name"] => string(5) "Alice"
// ["age"] => int(30)
// ["email"]=> string(17) "alice@example.com"
// }
? 提示:
-
ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PUBLIC可按需调整(如只取protected,去掉IS_PUBLIC) -
setAccessible(true)是必需步骤,否则读取 protected/private 属性会抛出ReflectionException - 此方法不会触发
__get(),直接读取属性原始值
✅ 在类内部定义 `toArray()` 方法(推荐用于可控类)
如果你能修改目标类,最清晰、最高效的方式是在类中显式提供转换逻辑:
class User {
public $name = 'Alice';
protected $age = 30;
protected $email = 'alice@example.com';
public function toArray() {
return [
'name' => $this->name,
'age' => $this->age,
'email' => $this->email,
];
}
}
$user = new User();
var_dump($user->toArray()); // 直接、安全、可维护
✅ 优点:
- 无需反射,性能更好
- 可控制字段顺序、过滤敏感字段(如密码)、做类型转换或格式化
- IDE 友好,支持自动补全和静态分析
⚠️ 不推荐:序列化 + 反序列化 或 `var_export()`
这些方式可能暴露内部结构、破坏对象状态、无法处理资源/闭包/循环引用,且无法精准提取 protected 属性 —— 属于黑盒操作,不安全也不可靠。
不复杂但容易忽略:确保你用的是真实存在的 PHP 版本(查 php -v),再选择对应方案。反射是最通用的外部解法;自定义 toArray() 是最佳实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











