PHP 数组转对象

2022-03-01 12:24:13 +08:00
 aababc

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

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

spatie/data-transfer-object - Packagist
https://packagist.org/packages/spatie/data-transfer-object
james122333
2022-03-01 14:21:29 +08:00
你可以写一个基本数组与进来的资料进行结构比对 这样的好处是不用用反射
转成对象需要反射 用法和 java 差不多 效能有些许的影响
meshell
2022-03-02 09:34:26 +08:00
你要不试试这个插件,deep-assoc-completion 虽然也是标注的。
aababc
2022-03-02 09:49:59 +08:00
@meshell 感谢,这个装的有,现在的 PHPStorm 针对有标注的数组识别还是挺准的。
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
2022-03-02 14:21:03 +08:00
@HappyStraw 看起来挺好的,现在也有比较完善的解决方案,还在权衡利弊!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/837122

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX