0

0

如何优雅地处理PHP数据结构:使用phpexperts/simple-dto提升代码质量与效率

心靈之曲

心靈之曲

发布时间:2025-09-24 10:36:03

|

990人浏览过

|

来源于php中文网

原创

可以通过一下地址学习composer学习地址

在日常的php开发中,我们常常会遇到这样的场景:从外部接口接收到一大串json数据,或者从数据库中查询出一条记录,它们通常都被解析成php数组。为了方便,我们可能直接在代码中通过 array['key'] 的方式来访问数据。起初这似乎没什么问题,但随着项目规模的扩大和业务逻辑的复杂化,这种方式的弊端就逐渐显现出来了:

  1. 可读性差:一个数组可能包含几十个键值对,如果不看文档,很难一眼看出这个数组到底代表了什么,有哪些必填字段,哪些是可选的。
  2. 缺乏类型安全:PHP数组本身不强制类型,你可能期望某个键是字符串,结果却收到了一个整数,这很容易导致运行时错误。
  3. 难以维护:如果数据结构发生变化,你需要手动修改所有用到这个数组的地方,稍有遗漏就可能引发线上问题。
  4. 数据易被篡改:数组是可变的,在代码的不同地方,数据可能会被无意中修改,导致难以追踪的bug。

为了解决这些痛点,我们通常会引入“数据传输对象”(Data Transfer Object,简称DTO)的概念。DTO是一种设计模式,它将数据封装成一个对象,提供清晰的结构和类型定义。然而,手动为每个数据结构编写DTO类,包括构造函数、属性、getter方法等,又会带来大量的样板代码。

这时,phpexperts/simple-dto 这个Composer包就如同救星一般出现了。它是一个轻量级且功能强大的DTO实现,旨在简化DTO的创建和使用,同时提供类型安全和不可变性。

phpexperts/simple-dto:让数据结构清晰可见

phpexperts/simple-dto 的核心理念是:将数组数据映射到带有明确类型定义的类属性上,并确保对象一旦创建就不可更改(Immutable)。这意味着你的数据将变得可预测,且在应用程序的不同层级传递时保持一致性。

安装与基本使用

首先,通过Composer轻松安装:

立即学习PHP免费学习笔记(深入)”;

AI小聚
AI小聚

一站式多功能AIGC创作平台,支持AI绘画、AI视频、AI聊天、AI音乐

下载
composer require phpexperts/simple-dto

接下来,我们来看看如何定义一个简单的DTO。假设我们需要处理用户的生日信息,包含姓名和生日日期:

use Carbon\Carbon;
use PHPExperts\SimpleDTO\SimpleDTO;

/**
 * @property-read string $name
 * @property-read Carbon $date
 */
class BirthdayDTO extends SimpleDTO
{
    /** @var string */
    protected $name;

    /** @var Carbon */
    protected $date;
}

// 实例化DTO
$birthdayDTO = new BirthdayDTO([
    'name' => 'John Doe',
    'date' => '1990-01-15',
]);

// 访问数据,如同访问普通对象属性
echo $birthdayDTO->name; // 输出: John Doe

// 惊艳之处:自动将日期字符串转换为 Carbon 对象
echo $birthdayDTO->date->format('Y年m月d日'); // 输出: 1990年01月15日

// 轻松转换为数组或JSON
$dataArray = $birthdayDTO->toArray();
echo json_encode($birthdayDTO, JSON_PRETTY_PRINT);

从上面的例子可以看出,phpexperts/simple-dto 带来了以下显著优势:

  1. 清晰的结构定义:通过 @property-read DocBlock 和 protected 类型属性,你可以一目了然地知道DTO包含哪些字段及其类型。
  2. 自动类型转换:对于 CarbonCarbon\Carbon 类型的属性,它会自动将日期字符串转换为 Carbon 对象,省去了手动转换的麻烦。
  3. 不可变性:一旦 BirthdayDTO 对象创建,其内部属性就不能被修改。如果需要修改数据,你必须创建一个新的DTO实例,这极大地提高了数据的可预测性和代码的健壮性。
  4. 便捷的序列化:内置 toArray()json_encode() 支持,方便将DTO转换为数组或JSON字符串。

更多高级特性

phpexperts/simple-dto 还提供了一些高级功能,以适应更复杂的场景:

  • WriteOnce Trait:有时,你可能需要在DTO创建后,在某个特定时机设置一次属性(例如,在多步骤表单中)。WriteOnce Trait 允许你将某些属性初始化为 null,然后只设置一次。
  • #[IgnoreAsDTO] Attribute (PHP 8+):如果你有一些 protected 属性不希望被DTO机制管理,可以使用此属性将其排除。
  • NestedDTOs:当你的数据结构包含其他复杂对象时,NestedDTOs 允许你轻松地嵌套DTO,构建出多层级的数据模型。例如,一个订单DTO可以包含一个客户DTO和多个商品DTO。
use PHPExperts\SimpleDTO\NestedDTO;
use PHPExperts\SimpleDTO\SimpleDTO;

/**
 * @property-read string $productName
 * @property-read int $quantity
 */
class ProductDTO extends SimpleDTO
{
    protected string $productName;
    protected int $quantity;
}

/**
 * @property-read string $orderId
 * @property-read ProductDTO[] $products
 */
class OrderDTO extends NestedDTO
{
    protected string $orderId;
    protected array $products; // 数组中的每个元素都会被自动转换为 ProductDTO
}

$order = new OrderDTO([
    'orderId' => 'ORD-2023001',
    'products' => [
        ['productName' => 'Laptop', 'quantity' => 1],
        ['productName' => 'Mouse', 'quantity' => 2],
    ]
]);

echo $order->products[0]->productName; // 输出: Laptop

总结其优势与实际应用效果

使用 phpexperts/simple-dto,你的PHP代码将变得:

  • 更易读:通过DTO的类定义,数据结构一目了然。
  • 更健壮:类型安全和不可变性减少了运行时错误和意外数据修改的风险。
  • 更易维护:数据结构变更时,只需修改DTO定义,IDE也能提供更好的重构支持。
  • 更高效:减少了手动验证和转换数据的样板代码。
  • 架构更清晰:促进了不同层级之间的数据传输规范化,提升了代码质量。

无论你是在构建API、处理表单提交,还是在应用程序的不同模块之间传递数据,phpexperts/simple-dto 都能帮助你将混乱的数组数据转化为清晰、安全、可维护的对象,让你的PHP项目开发体验更上一层楼。告别那些令人头疼的 array['undefined_key'] 错误吧,拥抱结构化和类型安全的数据传输!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
composer是什么插件
composer是什么插件

Composer是一个PHP的依赖管理工具,它可以帮助开发者在PHP项目中管理和安装依赖的库文件。Composer通过一个中央化的存储库来管理所有的依赖库文件,这个存储库包含了各种可用的依赖库的信息和版本信息。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

161

2023.12.25

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

547

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
第二十四期_PHP8编程
第二十四期_PHP8编程

共86课时 | 3.5万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.6万人学习

第二十三期_PHP编程
第二十三期_PHP编程

共93课时 | 7.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号