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

如何在特定类对象被json_encode序列化时抛出异常?

实现特定类实例被json_encode序列化时抛出异常

核心实现思路

利用PHP的JsonSerializable接口,在目标类的jsonSerialize()方法中直接抛出LogicException。当json_encode处理该类实例(无论直接传入还是嵌套在数组/其他对象中)时,会自动调用这个方法,从而触发异常并中断序列化流程,避免生成无效/空数据结构。

代码实现

改造目标类

给需要限制序列化的类实现JsonSerializable接口,并在接口方法中抛出异常:

class ValueObject implements JsonSerializable
{
    public function __construct(public string $someProperty)
    {
    }

    public function jsonSerialize(): mixed
    {
        throw new LogicException('ValueObject实例不允许被序列化为JSON');
    }
}

测试直接序列化场景

$an_object = new ValueObject('example');
try {
    $result = json_encode($an_object, JSON_PRETTY_PRINT);
    echo $result;
} catch (LogicException $e) {
    echo '捕获异常:' . $e->getMessage();
}

执行后会直接抛出异常,不会生成无效的JSON结构。

测试嵌套结构场景

$nested_array = [
    [
        'foo',
        new ValueObject('foo'),
        new ValueObject('GNARF'),
    ],
    'gnarf' => new ValueObject('poit'),
];

try {
    $nested_result = json_encode($nested_array, JSON_PRETTY_PRINT);
    echo $nested_result;
} catch (LogicException $e) {
    echo '捕获异常:' . $e->getMessage();
}

json_encode遍历数组时遇到ValueObject实例,会触发其jsonSerialize()方法,同样抛出异常,满足嵌套场景的需求。

批量复用方案

如果有多个类需要实现该限制,可以抽象出一个基类,让目标类继承即可:

abstract class ForbidJsonSerialization implements JsonSerializable
{
    public function jsonSerialize(): mixed
    {
        throw new LogicException(get_class($this) . '实例不允许被序列化为JSON');
    }
}

// 目标类继承基类
class ValueObject extends ForbidJsonSerialization
{
    public function __construct(public string $someProperty)
    {
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:19:59