现代感网站山西建站推广

张小明 2025/12/26 15:50:26
现代感网站,山西建站推广,怎么判断网站的好坏,山西响应式网站制作PHP 值对象实战指南#xff1a;避免原始类型偏执 上一篇文章里#xff0c;我们聊了原始类型偏执#xff08;Primitive Obsession#xff09;在 PHP 里为什么这么常见#xff1a;邮箱、金额、日期、ID……统统用 string/int/float/array 传来传去。领域含义被抹平#xf…PHP 值对象实战指南避免原始类型偏执上一篇文章里我们聊了原始类型偏执Primitive Obsession在 PHP 里为什么这么常见邮箱、金额、日期、ID……统统用 string/int/float/array 传来传去。领域含义被抹平校验逻辑散落在各处代码越写越难改。这一篇我们继续往下走值对象Value Object不仅能让代码更清晰还能让协作、测试和后续演进都更省心。不管你用的是 Laravel、Symfony 还是别的框架只要项目里有明确的领域概念值对象都能派上用场。原文链接 PHP 值对象实战指南避免原始类型偏执1. 重复出现的模式不只是代码味道在 PHP 项目里某些规则会反复出现。日期就是典型例子publicfunctionregisterEvent(string$eventDate,string$timeZone):void{if(!preg_match(/^\d{4}-\d{2}-\d{2}$/,$eventDate)){thrownewInvalidArgumentException(Invalid date format.);}if(!in_array($timeZone,DateTimeZone::listIdentifiers())){thrownewInvalidArgumentException(Invalid time zone.);}// More logic here...}这里的日期和时区都用 string 表示。问题在于一旦日期格式要改、或者时区规则有变化你就会开始在各个角落复制粘贴同样的验证逻辑——漏一处就出事故。2. 值对象登场Date 和 TimeZone与其在每个入口都手写校验不如把“日期”“时区”做成值对象让它们自己保证合法性。2.1 Date 值对象finalclassDate{privatestring$value;privatefunction__construct(string$date){if(!preg_match(/^\d{4}-\d{2}-\d{2}$/,$date)){thrownewInvalidArgumentException(Invalid date format.);}$this-value$date;}publicstaticfunctionfromString(string$date):self{returnnewself($date);}publicfunctionvalue():string{return$this-value;}publicfunction__toString():string{return$this-value;}}2.2 TimeZone 值对象finalclassTimeZone{privatestring$value;privatefunction__construct(string$timeZone){if(!in_array($timeZone,DateTimeZone::listIdentifiers())){thrownewInvalidArgumentException(Invalid time zone.);}$this-value$timeZone;}publicstaticfunctionfromString(string$timeZone):self{returnnewself($timeZone);}publicfunctionvalue():string{return$this-value;}publicfunction__toString():string{return$this-value;}}2.3 在业务里怎么用publicfunctionregisterEvent(Date$eventDate,TimeZone$timeZone):void{// No need for repetitive validation// Logic continues...}参数一眼就能看懂而且验证逻辑只存在一份在值对象里。3. 给值对象加上行为值对象不只是“更强的类型”。它还能承载和这个概念紧密相关的行为。比如你需要判断活动日期是否在未来可以把逻辑放进 DatefinalclassDate{// ..publicfunctionisInTheFuture():bool{$nownewDateTime();$eventDatenewDateTime($this-value);return$eventDate$now;}}这样就不用在每个用到日期的地方都重复写一遍比较逻辑也更符合领域表达判断未来与否本来就是“日期”这个概念的一部分。4. 金额用值对象守住精度处理金额是原始类型偏执最容易踩坑的地方之一。用 float 表示钱舍入误差迟早会找上门再加上币种、汇率复杂度会迅速拉高。把金额做成值对象通常的做法是用最小单位比如分把金额存成 int币种作为字段和金额绑定在一起下面这个 Money 示例进一步加上了换汇的行为finalclassMoney{privateint$amount;// Stored in minor units (e.g., cents)privatestring$currency;// Constructor and other methods...publicfunctionconvertToCurrency(string$targetCurrency,float$exchangeRate):self{$convertedAmount(int)round($this-amount*$exchangeRate);returnnewself($convertedAmount,$targetCurrency);}}把规则关在 Money 里你的业务代码就不用到处关心“这里是分还是元”“币种对不对”“舍入怎么做”。5. 在框架里落地一旦你开始用值对象Laravel / Symfony 反而会更好用你能把“原始数据 ↔ 值对象”的转换放到框架扩展点里业务层拿到的就都是领域类型。5.1 Laravel 示例Laravel 里可以用自定义 cast把数据库字段自动转成值对象useIlluminate\Contracts\Database\Eloquent\CastsAttributes;classMoneyCastimplementsCastsAttributes{publicfunctionget($model,string$key,$value,array$attributes){returnMoney::fromInt($value,USD);}publicfunctionset($model,string$key,$value,array$attributes){return$valueinstanceofMoney?$value-amount():$value;}}把这个 cast 挂到 Eloquent 模型上后取出来的就是 Money而不是裸值代码会干净很多。5.2 Symfony 示例Symfony 里可以用 Doctrine 的 embeddables 或自定义 DBAL type把 Money / EmailAddress 这类复杂类型映射到数据库classMoneyTypeextends\Doctrine\DBAL\Types\Type{constMONEYmoney;// Custom type namepublicfunctionconvertToPHPValue($value,\Doctrine\DBAL\Platforms\AbstractPlatform$platform){returnMoney::fromInt($value,USD);}publicfunctionconvertToDatabaseValue($value,\Doctrine\DBAL\Platforms\AbstractPlatform$platform){return$valueinstanceofMoney?$value-amount():$value;}}这样做的好处是从数据库到领域层你始终在用“领域类型”而不是一堆无意义的 string/int/float。6. 怎么迁移现有代码库引入值对象不需要推倒重来。最稳妥的方式是渐进式迁移先改边界层在 HTTP controller、表单请求、CLI 命令里把输入的原始值解析成值对象再改服务层逐步把 service 方法签名从原始类型换成值对象配合静态分析用 PHPStan 或 Psalm 强化类型约束尽早发现不匹配7. 结语让领域自己说话值对象的意义不在于“OO 更纯粹”而在于让领域概念变得清楚、可约束、可复用。下次你准备在方法里传一堆 string/int 的时候不妨停一下问自己“这真的是一个简单值吗还是一个应该被命名、被约束的领域概念”做出这个小改变短期能减少重复校验和隐性 bug长期则会让整个代码库更稳、更好改——也更照顾未来维护它的你。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

合肥网站建设王正刚vs2015网站开发教程

Qwen3-VL-30B-A3B-Thinking-FP8:打破多模态AI部署壁垒的变革性方案 【免费下载链接】Qwen3-VL-30B-A3B-Thinking-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-VL-30B-A3B-Thinking-FP8 在人工智能技术快速迭代的当下,300亿参数…

张小明 2025/12/22 3:48:34 网站建设

外卖优惠券网站怎么做数字化校园门户网站建设方案

AMD显卡AI革命:DeepSeek大模型本地部署完全指南 【免费下载链接】instinct 项目地址: https://ai.gitcode.com/hf_mirrors/continuedev/instinct 还在为AI大模型只能依赖云端服务而烦恼吗?现在,AMD显卡用户迎来了历史性突破&#xff…

张小明 2025/12/22 3:44:31 网站建设

PS网站设计陕西建设信息网官网

目录前言1 语言为何诞生:问题驱动而非审美设计1.1 1979 年的现实困境1.2 C with Classes:融合而非颠覆2 核心理念:在代码中直接表达思想2.1 零开销抽象的工程含义2.2 RAII:资源管理范式的确立2.3 静态类型系统与泛型抽象3 用户规模…

张小明 2025/12/22 3:42:30 网站建设

格力网站的建设情况常用网站建设工具

NutUI分类组件终极指南:3倍提升电商转化率的秘密武器 【免费下载链接】nutui 京东风格的移动端 Vue2、Vue3 组件库 、支持多端小程序(A Vue.js UI Toolkit for Mobile Web) 项目地址: https://gitcode.com/gh_mirrors/nu/nutui 你是否遇到过这样的场景&#…

张小明 2025/12/22 3:40:28 网站建设

地方门户网站怎么赚钱网页设计宣传推广方案

深入理解Flutter 在 Android 和 iOS 设备上的绘制底层原理,核心是搞清楚 Flutter 如何跨这两个系统实现统一的 UI 渲染,以及它在两端分别与系统底层渲染框架的交互逻辑 ——Flutter 的核心特点是「自绘引擎(Skia)接管全渲染流程」,避开了 Android/iOS 的原生 UI 组件系统,…

张小明 2025/12/22 3:38:26 网站建设

阳朔网站建设公司公司网站建设东莞

企业网站后台管理系统富文本编辑器Word/公众号内容导入功能集成方案 需求分析与技术评估 作为吉林某国企项目负责人,我们近期需要对现有企业网站后台管理系统的文章发布模块进行功能升级,主要需求如下: 核心需求: 在FCKEditor…

张小明 2025/12/22 3:36:24 网站建设