V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aababc
V2EX  ›  PHP

PHP 数组转对象

  •  
  •   aababc · 2022-03-01 12:24:13 +08:00 · 2390 次点击
    这是一个创建于 998 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在在业务开发的场景中遇到一个问题,PHP 很多情况下的参数都是数组形式的,比如从前端传过来的 JSON ,这样在向后传递使用的时候,我们不能明确的之后数组里有什么内容,或者需要借助注解的方式来声明参数。在多人配合开发的时候问题更大,所以现在就想把参数特别是从外部接受的参数都固定下来,转换成为预定义类的对象。想咨询一下大家有没有相关的事件,遇没遇到什么坑。

    8 条回复    2022-03-02 14:21:03 +08:00
    zpfhbyx
        1
    zpfhbyx  
       2022-03-01 12:28:05 +08:00
    Protobuf
    aababc
        2
    aababc  
    OP
       2022-03-01 13:00:00 +08:00
    @zpfhbyx 现在的方案都是 JSON 的,迁移到 Protobuf 的成本太高了,需要前后端联动。而且短期来看,也不回使用 Protobuf 所以就想在后端处理。
    Rache1
        3
    Rache1  
       2022-03-01 13:32:43 +08:00
    你可能需要这个?

    spatie/data-transfer-object - Packagist
    https://packagist.org/packages/spatie/data-transfer-object
    james122333
        4
    james122333  
       2022-03-01 14:21:29 +08:00
    你可以写一个基本数组与进来的资料进行结构比对 这样的好处是不用用反射
    转成对象需要反射 用法和 java 差不多 效能有些许的影响
    meshell
        5
    meshell  
       2022-03-02 09:34:26 +08:00
    你要不试试这个插件,deep-assoc-completion 虽然也是标注的。
    aababc
        6
    aababc  
    OP
       2022-03-02 09:49:59 +08:00
    @meshell 感谢,这个装的有,现在的 PHPStorm 针对有标注的数组识别还是挺准的。
    HappyStraw
        7
    HappyStraw  
       2022-03-02 13:49:54 +08:00
    我是做一个简单的参数转换:
    1. 基类(如: PropertyAccess);
    2. 实现 \JsonSerializable, \ArrayAccess 接口
    3. 实现了魔术方法__call, 完成 getter 和 setter, 里面可以对属性名字转换, 驼峰和下划线互相转换
    4. 参数选项默认 protected
    5. 提供静态方法 from(array $data)从 JSON 中初始化(默认赋值, 如子参数是 PropertyAccess 子类, 在里面初始化), 也可以在__construct 实现
    6. 提供 toArray(如子参数是 PropertyAccess 子类那就里面 toArray)

    大致的效果
    /**
    * Class User
    *
    * @method int getId()
    * @method string getName()
    * @method void setId(int $id)
    * @method void setName(string $name)
    */
    class User extends PropertyAccess
    {
    protected $id;

    protected $name;
    }

    $user = User::from(['id' => 1, 'name' => 'xiaoming']);

    echo $user->getName();
    echo $user->getId();
    echo json_encode($user);
    aababc
        8
    aababc  
    OP
       2022-03-02 14:21:03 +08:00
    @HappyStraw 看起来挺好的,现在也有比较完善的解决方案,还在权衡利弊!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2794 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:45 · PVG 22:45 · LAX 06:45 · JFK 09:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.