PHP 现代特性速查 写出更简洁安全的代码(第一篇)

news/2025/11/4 7:40:50/文章来源:https://www.cnblogs.com/catchadmin/p/19188682

PHP 现代特性速查 写出更简洁安全的代码(第一篇)

基础你肯定掌握了。这个三部曲写给每天写 PHP 的人,帮你把代码写得更清楚、bug 更少、跑得更快。上篇讲那些能改变 API、DTO 和调用方式的现代特性。

默认你在用 PHP 8.x+。例子都很短,直接扔进 Laravel service 或普通 PHP 文件就能跑。

原文链接 PHP 现代特性速查 写出更简洁安全的代码(第一篇)

Attributes — 声明式、可发现的元数据(PHP 8.0)

替代了什么:脆弱的 docblock 和注解解析。

示例

#[Route(path: '/users', methods: ['GET'])]
class UserController { /* ... */ }

效果:反射读 attribute,启动时自动注册路由。IDE 能看到这些元数据,静态分析也能识别。

建议:attributes 适合框架接线(路由、验证、序列化),保持简单——复杂配置还是老实用 DTO。

Named Arguments — 自解释的函数调用(PHP 8.0)

替代了什么:容易搞错顺序的长参数列表。

示例

function connect(string $host, int $port, bool $tls = false) { /* ... */ }// 更清晰,顺序无关
connect(port: 5432, host: 'db.internal', tls: true);

效果:调用像配置文件一样好读;加可选参数也不会破坏兼容性。

建议:工厂方法和 HTTP 客户端配置最适合——配合 readonly DTO 做不可变配置。

Constructor Property Promotion — 减少 service 和 DTO 的样板代码(PHP 8.0)

替代了什么:重复的属性声明和赋值。

示例

class Mailer {public function __construct(private LoggerInterface $log,private CacheInterface $cache) {}
}

效果:构造函数简洁,打字少了拼写错误也少,属性自动带类型和注入。

建议:小 service 和 DTO 用这个——构造函数参数多了还是老实写工厂或 builder。

类型化属性(Typed Properties)— 尽早强制契约(PHP 7.4)

替代了什么:松散的 @var docblock 和混乱的 mixed 类型。

示例

class Order {public int $id;public ?DateTimeImmutable $shippedAt = null;
}

效果:赋错类型立刻抛 TypeError——领域 bug 早发现。

建议:配合静态分析(PHPStan/Psalm)在 CI 阶段就把问题拦住。

联合类型(Union Types)— 明确、灵活的 API(PHP 8.0)

替代了什么:模糊的 mixed 和不明确的类型提示。

示例

function find(string|int $id): ?User { /* ... */ }

效果:函数签名明确写出接受什么类型;静态工具能验证调用。

建议:union 要有意义——别动不动就 string|int|float|bool,除非真需要。

交叉类型(Intersection Types)— 更严格的多能力契约(PHP 8.1)

替代了什么:运行时检查对象是否实现多个接口。

示例

function process(Reader&Logger $obj) {// $obj 同时是 Reader 和 Logger
}

效果:编译时就能保证对象有你要的能力。

建议:装饰器和适配器最适合,确保它们同时满足多个接口。

Enums — 用领域安全的值替代魔法字符串(PHP 8.1)

替代了什么:容易出错的常量和字符串。

示例

enum PaymentStatus: string {case PENDING = 'pending';case PAID    = 'paid';case FAILED  = 'failed';
}$status = PaymentStatus::PAID;

效果:match 能穷举所有情况、重构更安全、日志也更清楚。

建议:持久化用 backed enums(string/int);常见的领域逻辑直接写在 enum 方法里。

只读属性和只读类(Readonly)— 不可变 DTO(属性:PHP 8.1;类:PHP 8.2)

替代了什么:手写的不可变对象和意外的变更 bug。

示例

readonly class UserDTO {public function __construct(public int $id,public string $email) {}
}

效果:构造完就不能改了——事件、配置、API 响应都适合。

建议:跨进程传的数据(队列、事件)优先用 readonly。

一等公民可调用对象(First-class Callables)— 简洁、零样板的回调(PHP 8.1)

替代了什么:冗长的匿名函数或基于字符串的 callable。

示例

$upper = strtoupper(...);
$names = array_map($upper, ['alice','bob']);

效果:管道好读,开销小。

建议:配合 array_map/array_filter 用,意图清楚。不需要捕获变量时别用闭包。

组合使用:真实例子

假设写个控制器动作,把这些特性组合起来:

#[Route(path: '/orders', methods: ['POST'])]
final class CreateOrderAction {public function __construct(private OrderService $service,private LoggerInterface $logger) {}public function __invoke(CreateOrderDTO $dto): JsonResponse {$order = $this->service->create($dto);$this->logger->info('order.created', ['id' => $order->id]);return new JsonResponse(['id' => $order->id], 201);}
}

这段代码把 attributes(路由)、constructor promotion(注入)、readonly DTO(不可变)、typed properties 和 enums(领域安全)组合在一起,代码简洁、一看就懂、还更安全。

高级技巧 — 老手怎么组合这些特性

验证管道:DTO + attributes + 静态分析,能在编译期验证的就别等运行时。

领域值对象:少用松散数组,多用小 readonly 值对象——类型化属性能帮你挡住下游的 bug。

Match + Enums:别用布尔标志和字符串 switch 了,enum 配 match 穷举,编译器帮你找漏掉的分支。

交叉类型给适配器:适配器要同时实现 Cacheable&Loggable 才能传给基础设施。

一等公民可调用对象优化 map:没有闭包分配开销,快一点也清楚一点。

什么时候别用这些特性(注意事项)

attributes 太多会拖慢反射 — 做接线可以,别在字段上堆一堆元数据。

Named arguments 在 DI 容器里可能出问题 — 调用时用它提升可读性没问题,写库给别人用就别这么干。

到处 readonly 开发时很烦 — DTO 和事件用 readonly 有意义,service 对象就别折腾了。

升级路线

还在 PHP < 7.4:先升到 7.4,类型化属性值得。

想提升生产力:直接上 8.1(enums、只读属性、一等公民可调用对象、交叉类型)。

8.2 加了只读类和其他改进——有用但不急。

最后

这些特性不是玩具,它们改变你建模数据、强制约束、理解系统的方式。用好了,attributes、enums、类型化属性能让代码更稳、团队更快。

代码库还在用魔法字符串、靠 docblock 或到处传可变数组?选一个特性(enums 或 readonly DTO)先迁移一个模块试试。效果好了,后面就好办了。

准备用哪个特性?说说你的痛点,我帮你找投入小、收益大的改法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/955129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dump so dump dex

dump so dump dex旧版# frida_dump_so``` > frida -U packagename -l dump_so.js ____ / _ | Frida 12.4.7 - A world-class dynamic instrumentation toolkit | (_| | > _ | Commands: /_/ |_| help -> Dis…

前小米高管创业,融资近2亿元,要做AI影像消费硬件丨智能涌现独家

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087在小米工作的11年,从一线员工做到管理层,马骥“创业”过不止一次…

AI元人文:核心工作路径(共三篇)

AI元人文:核心工作路径(共三篇) AI元人文:核心工作路径——从混沌到共识的涌现流程 AI元人文的实践并非一蹴而就,其力量在于遵循一个严谨的、递进的工作路径。此路径环环相扣,确保了价值权衡过程既充满人文弹性,…

Java代码开发规范(基于Claude Code与Google Java Style Guide)

Java代码开发规范(基于Claude Code与Google Java Style Guide) 1. 总则与目标 1.1 规范目的 本规范旨在为使用Claude Code进行Java开发的团队提供一个统一、明确且专业的协作标准。其核心目标在于通过标准化代码风格…

读浪潮将至05更广泛的浪潮

读浪潮将至05更广泛的浪潮1. 更广泛的浪潮 1.1. 技术浪潮并非一两种通用技术的简单叠加,而是大约同一时期涌现的众多技术的集群式体现1.1.1. 以某种或多种通用技术为基础,但又远远超出这些通用技术的范畴1.2. 通用技…

[openwrt] openwrt换成清华源后,SSL verify error: unknown error

root@OpenWrt:/etc/opkg# opkg update Downloading https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.4/targets/bcm27xx/bcm2711/packages/Packages.gz SSL verify error: unknown error *** Failed to …

[openwrt] ash: /usr/libexec/sftp-server: not found scp: Connection closed

scp luci-app-openclash_0.47.028_all.ipk root@10.10.2.3:/root root@10.10.2.3s password: ash: /usr/libexec/sftp-server: not found scp: Connection closed The error "ash: /usr/libexec/sftp-server: not…

[openwrt]OpenWRT换成清华源

来源:https://mirror.tuna.tsinghua.edu.cn/help/openwrt/手工替换 登录到路由器,并编辑 /etc/opkg/distfeeds.conf 文件,将其中的 http://downloads.openwrt.org 替换为https://mirrors.tuna.tsinghua.edu.cn/open…

[OpenWRT/LEDE] a short history of OpenWRT

OpenWrt acquired its name in 2004, coinciding with its initial public release. Here’s the precise historical context:The project began as a fork of the Linksys WRT54G firmware, which itself was based …

2025年11月学生平板品牌对比榜:新课标适配与错题管理实力榜

开学季刚过,期中备考紧随其后,家长群里讨论最多的不再是“报哪门网课”,而是“该给孩子换一台怎样的学生平板”。调研机构艾瑞咨询2025年9月发布的《中国家庭教育智能硬件报告》显示,76.4%的小初高家长计划在未来六…

2025年11月学生平板品牌推荐:全维度评测榜看清北直播课与AI题库

开学季刚过,期中备考接踵而至,家长群里“该给孩子换台学习平板吗”的提问再次刷屏。调研机构QuestMobile2025年9月数据显示,K12家庭拥有教育硬件的比例已升至68%,其中能同步校内教材、提供闭环练习的“学生平板”成…

2025年11月学生平板品牌评测:读书郎T5系列与四款竞品实力排行

进入十一月,期中考试刚结束,期末倒计时悄然启动,家长群里“该买哪台学习平板”的话题热度再次飙升。后台私信里,高频出现的词是“同步教材”“护眼大屏”“能不能真的提分”。这些关键词背后,是三类典型场景:一是…

2025年11月卖得好的学习机品牌推荐:家长榜评价

孩子放学回家,作业辅导、预习复习、错题订正,家长既想放手又怕孩子走神,一台“卖得好的学习机”于是成为客厅里的新刚需。2025年秋季学期过半,双减政策持续收紧,校外学科培训几乎绝迹,家庭场景重新成为学习主战场…

2025年11月适合小学生的学习机品牌推荐:热门机型排行与实测

孩子升入小学后,作业量陡增,家长却常陷入“不会教、教不动”的困境:课本知识点零散、孩子注意力易分散、家长时间碎片化。一台能把校内同步、趣味互动、视力保护、家长管控一次到位的小学生专用学习机,于是成为客厅…

2025年11月卖得好的学习机品牌推荐:市场榜五强评测

开学季刚过,双11又至,家长群里最热的话题莫过于“该给孩子换哪台学习机”。有人担心课程版本不匹配,有人怕屏幕伤眼,更有人被动辄三四千的价格吓退。教育部2025年二季度发布的《教育智能硬件消费观察》显示,学习机…

2025年11月卖得好的学习机品牌推荐:实力榜排行与真实评价汇总

“双减”之后,家庭场景成为学科补充的主阵地,家长把“学习机”当成减轻自身辅导压力、提升孩子效率的刚需硬件。2025年秋季学期过半,期中成绩出炉,不少家长发现孩子知识漏洞集中、学习习惯松散,于是把“换一台更顺…

2025年11月适合小学生的学习机品牌推荐:最新榜单对比评测与真实口碑排行

孩子刚上一年级,作业辅导成了全家“鸡飞狗跳”的固定节目:拼音读不准、口算总出错、英语听力像天书,家长一着急就吼,孩子一紧张就哭。想买台学习机帮忙,可打开电商页面,满眼都是“AI精准学”“护眼屏”“同步教材…

AI元人文:价值权衡的计算理论与共识涌现新范式

AI元人文:价值权衡的计算理论与共识涌现新范式 副标题:基于价值原语和三值纠缠的权衡 笔者:岐金兰 摘要:为克服人工智能在价值敏感决策中的“不可通约性”困境,本文提出“AI元人文”构想,旨在构建一个形式化框架…

2025年北京债务债权律师事务所权威推荐榜:专业债务纠纷处理与债权追索法律服务口碑之选

2025年北京债务债权律师事务所权威推荐榜:专业债务纠纷处理与债权追索法律服务口碑之选 在当今复杂多变的经济环境中,债务债权纠纷已成为企业运营和个人资产保护面临的重要挑战。北京作为国家经济中心,各类债务债权…