You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP类对象转数组时如何去除命名空间前缀?

解决PHP对象转数组时键名带命名空间前缀的问题

问题原因

PHP将包含私有属性的对象转换为数组时,私有属性的键会被自动格式化为 \x00类全名\x00属性名(\x00 是空字节),这就是你看到带命名空间前缀的原因。

解决方法

方法1:手动清理数组键名

直接遍历转换后的数组,用正则表达式去除空字节和命名空间部分:

$seller = new Seller($sellerData);
$array = json_decode(json_encode((array)$seller->getSeller()), true);

// 清理键名
$cleanedArray = array_combine(
    array_map(fn($key) => preg_replace('/^\x00.*\x00/', '', $key), array_keys($array)),
    array_values($array)
);

dd($cleanedArray);

方法2:让Seller类实现JsonSerializable接口

在Seller类中实现JsonSerializable接口,自定义序列化结构,让json_encode直接使用你定义的键名:

class Seller implements \JsonSerializable
{
    private $seller_id;
    private $name;
    // 其他私有属性

    public function jsonSerialize(): mixed
    {
        return [
            'seller_id' => $this->seller_id,
            'name' => $this->name,
            // 按需添加其他需要序列化的属性
        ];
    }
}

之后直接使用原有代码即可得到干净的数组:

$seller = new Seller($sellerData);
dd(json_decode(json_encode($seller->getSeller()), true));

方法3:用反射API获取私有属性

通过PHP反射安全读取私有属性,避免自动生成带前缀的键:

$seller = new Seller($sellerData);
$sellerObj = $seller->getSeller();

$reflection = new \ReflectionObject($sellerObj);
$properties = $reflection->getProperties(\ReflectionProperty::IS_PRIVATE);

$cleanedArray = [];
foreach ($properties as $prop) {
    $prop->setAccessible(true);
    $cleanedArray[$prop->getName()] = $prop->getValue($sellerObj);
}

dd($cleanedArray);

方法4:为Seller类添加toArray方法

在Seller类中封装一个toArray方法,手动返回需要的属性数组:

class Seller
{
    private $seller_id;
    private $name;
    // 其他私有属性

    public function toArray(): array
    {
        return [
            'seller_id' => $this->seller_id,
            'name' => $this->name,
            // 按需添加其他属性
        ];
    }
}

使用时直接调用该方法:

$seller = new Seller($sellerData);
dd($seller->getSeller()->toArray());

内容的提问来源于stack exchange,提问作者mdkamrul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:10:18