滚动新闻 →
抗议习近平访美后突发意外 界立建脱险后首发声 美科技巨头签AI自律协议 川普表态拒绝与中共合作! 林志玲当妈也曾不知所措 鼓励妈妈们爱自己 前美国CIA官员:习近平依赖彭丽媛军中人脉 Windows 11 性能监视器怎么用?适合进阶用户的系统诊断工具 广东43岁男用土豆当主食 半年瘦25斤逆转三高 PHP strict_types 怎么开启?严格类型检查对项目开发有哪些帮助 《诗经》为什么不是一本遥远的古代诗集 《本草纲目》对中国传统药物文化的影响 科技高峰会共同承诺 川普令开启超智能时代 围棋中的定式应该怎样学习 西安村民菜地挖出古代经幢 距今八百多年 如何让孩子学会关心父母而不是只会索取 中共正部级高官 证监会前主席易会满被逮捕 景深对视频画面有什么影响 杜拜飞以色列客机突发紧急代码 引发劫机恐慌 拜占庭帝国为什么能够长期延续 小厨房最容易出现哪些空间浪费 大陆网红车商失联跑路 上千购车人面临风险 “赵丽颖身体到底怎么了”冲上热搜 重庆暴雨冲毁铁路涵洞 列车乘客被困7小时 节庆食品为什么能够保存一个民族的文化记忆 旅行前如何制定交通方案 中国空姐被逼向男子跪地道歉 还被要求“踹一脚” 发动机上方渗油维修需要更换什么 为什么同一辆车在不同充电桩充电速度不同 台湾东部海域突发5.9地震 极浅层多地有感 石膏板墙上挂东西需要什么工具 大模型推理为什么存在首 Token 延迟,TTFT 背后的计算过程究竟是什么 Google Cloud DDoS 防护应该怎么做,企业网站需要关注哪些网络安全问题 SaaS 登录状态是怎么保存的,Cookie、Session 和 Token 各有什么区别 男子捡鹅蛋吃 大鹅当场“气死” 美释出4千万桶战略石油储备 压低飙升油价 习访美抗议后界立建失联 昏迷送医曾吐血水 显卡安装后系统不稳定,如何检查PCIe插槽和显卡供电 四川官媒称警察帮女子砸手机防电诈 网嘲:编的太假 Windows 11 系统资源监视器怎么用?比任务管理器看到更多信息 普京大举扩兵 泽连斯基:朝鲜拟增派1万兵赴俄 棋王赛循环圈:赖均辅五连胜 距挑战权一步之遥 大选时两度告川普 史密斯参院听证曝秘密取证

PHP strict_types 怎么开启?严格类型检查对项目开发有哪些帮助

发布时间: 2026-09-30 05:30:02    最后更新: 2026-09-30 06:21:51    阅读:7  约1 分钟阅读     

PHP 是动态类型语言,但现代 PHP 已经提供了相当完整的类型声明体系。参数、返回值、属性、联合类型、可空类型、接口和枚举等功能,让大型 PHP 项目可以建立比传统 PHP 代码更加明确的类型契约。 其中 declare(strict_types=1) 是很多开发者都会遇到的功能。 它的作用并不是把 PHP 变成 Java、C# 这类静态类型语言,也不是简单地打开一个“全项目严格检查开关”。它主要改变当前 PHP 文件中函数调用涉及的标量类型转换规则,让错误的数据类型更早暴露出来。 对于中大型 SaaS、API、后台系统以及长期维护的 PHP 项目,这种差异非常重要。 strict_types怎么开启 最常见的写法是: prepare( 'SELECT * FROM users WHERE id = :id' ); $stmt->execute([ 'id' => $id ]); 类型声明和 SQL 参数绑定解决的是不同问题。 即使 $id 是 int,也不能因此形成“所有 SQL 注入问题都被 PHP 类型系统解决”的错误认识。 第三方库不需要因为strict_types而强行修改 Composer 项目经常同时包含自己的代码和大量第三方包。 如果自己的文件使用: declare(strict_types=1); 并不意味着应该直接修改 vendor 目录里的第三方代码。 升级第三方包时,Composer 会重新安装这些文件,手工修改也会丢失。 如果遇到类型兼容问题,首先应该查看库本身支持的 PHP 版本、API 类型声明以及调用方式。 必要时,在自己的应用边界上进行明确的数据转换。 例如数据库、HTTP 请求、JSON 数据等外部输入本身就经常需要转换和验证。 严格类型并不意味着: “所有输入进来以后都不能转换。” 正确的做法是让转换发生在明确的位置,而不是让类型转换散落在整个业务代码中。 外部输入本来就需要转换 假设 URL 中存在: ?id=123 PHP 从 HTTP 请求获得的查询参数通常是字符串。 业务层可能需要整数。 这时可以在输入边界进行明确验证和转换: $id = filter_input( INPUT_GET, 'id', FILTER_VALIDATE_INT ); if ($id === false || $id === null) { throw new InvalidArgumentException('Invalid user ID'); } 然后再把已经验证过的整数传给业务函数: $user = findUser($id); 这种设计比让业务层到处依赖隐式类型转换更加清晰。 严格类型并不是要求“永远不要转换类型”,而是鼓励开发者明确知道什么时候、为什么以及在哪里发生类型转换。 大型项目应该采用渐进式迁移 如果一个运行多年的 PHP 项目突然给所有文件加上: declare(strict_types=1); 然后把所有参数和返回值一次性改成严格类型,很可能会产生大量问题。 原因并不是 strict_types 有问题,而是旧代码长期依赖了 PHP 的动态特性。 例如: function getPrice($value) { return $value * 1.13; } 这个函数可能被不同地方调用: getPrice(10); getPrice("10"); getPrice(null); getPrice(false); 如果直接加入: function getPrice(float $value): float 再配合严格模式,就可能暴露大量原来被隐式转换掩盖的调用问题。 这种情况下更适合渐进式迁移。 新代码首先使用严格类型。 修改旧模块时逐步增加参数和返回类型。 对数据库、HTTP、JSON、CLI 参数等外部输入建立明确的数据边界。 然后使用 PHPStan 或 Psalm 持续发现剩余类型问题。 PHPDoc仍然有价值 即使项目已经大量使用 PHP 原生类型声明,PHPDoc 仍然没有失去作用。 例如数组的结构: /** * @param array{id:int,email:string,active:bool} $user */ function processUser(array $user): void { // ... } 原生 PHP 可以知道 $user 是数组,但不能完整表达所有复杂数组结构。 PHPStan、Psalm 等静态分析工具可以利用 PHPDoc 提供更加详细的信息。 因此现代 PHP 项目通常是原生类型声明与 PHPDoc、静态分析工具结合使用,而不是三选一。 strict_types不是性能优化功能 原文把 strict_types 与 PHP 7 JIT、类型推断以及性能损耗联系起来,这种说法容易让读者产生错误认识。 使用 strict_types=1 的主要目的不是优化 PHP 程序性能。 它的核心价值是明确类型契约、减少不必要的隐式转换以及让类型错误更早暴露。 在正常 SaaS 项目中,不应该把性能优化重点放在“strict_types 会不会让代码快几个百分点”。 真正影响 PHP 应用性能的通常是数据库查询、网络请求、缓存命中率、PHP-FPM worker、CPU、内存、I/O、序列化、第三方 API 以及应用本身的算法和架构。 如果项目存在实际性能问题,应该使用 profiling 工具测量,而不是根据是否启用 strict_types 猜测性能。 strict_types也不是安全机制 类型声明可以减少一部分逻辑错误,但不能把它当成安全防护系统。 它不能阻止 SQL 注入。 不能代替 CSRF Token。 不能代替 XSS 防护。 不能代替权限控制。 不能代替 SaaS 租户隔离。 不能代替身份认证。 不能阻止攻击者提交合法类型但恶意的数据。 例如: function transferMoney(int $from, int $to, float $amount): void 这个函数的类型声明非常清晰。 但如果没有检查当前用户是否拥有 $from 账户的控制权,那么即使所有参数类型都正确,系统仍然可能存在严重的越权漏洞。 一个更合理的PHP项目规范 对于新开发的 PHP 8.x 项目,可以考虑把严格类型作为默认编码规范:

喜欢这篇报道?

使用下面的功能,方便以后继续阅读和分享 MNewsTV

设为 Google 新闻首选来源 让 Google 新闻优先显示 MNewsTV 的最新报道 ›
★ 我的收藏 查看已经收藏的文章
关于文章收藏 收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。 删除收藏请进入「我的收藏」进行管理。
分享这篇报道

捐助(Paypal): https://www.paypal.me/observeccp
订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP