PHPStan 错误标识符 property.writeOnly 详解:如何检测并修复对 `@property-write` 只写属性的读取
开发工具代码质量静态分析【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址https://gitcode.com/gh_mirrors/ph/phpstan点击查看免费下载PHPStan 的property.writeOnly错误标识符error identifier用于报告代码读取了一个通过property-writePHPDoc 标签声明为只写的属性。本文以 website/errors/property.writeOnly.md 为核心结合仓库内的错误标识符注册表与同类错误文档讲解该错误的触发场景、底层检测规则以及两种标准修复方案帮助你准确理解property/property-read/property-write三种虚拟属性方向的语义差异并在实际项目中正确使用它们。错误标识符概述在 PHPStan 中每个错误都对应一个稳定的错误标识符identifier形如property.writeOnly用于在配置中精确地忽略、统计或分类某类错误。该标识符的元数据记录在 website/src/errorsIdentifiers.json 中与其对应的检测规则为 PHPStan 源码仓库phpstan-src中的PHPStan\Rules\Properties\ReadingWriteOnlyPropertiesRule详见该文件property.writeOnly条目指向ReadingWriteOnlyPropertiesRule.php第 73 行。原文档 frontmatter 中定义如下titleproperty.writeOnlyshortDescriptionWrite-only property declared via property-write is being read.ignorabletrue其中ignorable: true意味着该错误支持被列入忽略清单例如通过ignoreErrors配置按 identifier 忽略见后文如何配置与忽略。触发条件最小复现示例当类通过property-write声明了一个只写虚拟属性而代码却去读取它时PHPStan 就会报告property.writeOnly。以下是原文档给出的完整示例?php declare(strict_types 1); /** * property-write int $writeOnlyProperty */ #[\AllowDynamicProperties] class Foo { public function doFoo(): void { echo $this-writeOnlyProperty; } }示例要点分析property-write int $writeOnlyProperty声明该属性只能写入、不能读取#[\AllowDynamicProperties]允许 PHP 8.2 在类上动态创建属性PHPStan 据此配合 PHPDoc 标签识别该虚拟属性echo $this-writeOnlyProperty;是一次明确的读取操作直接违反只写约束因此触发property.writeOnly。值得注意的是该错误不限于动态属性场景只要类通过property-write声明了只写属性无论底层是魔术方法__set/__get还是动态属性读取动作都会被检测到。仓库文档 website/src/writing-php-code/phpdocs-basics.md 中也说明对于自定义__get/__set逻辑可以在类上方放置property标签若属性只允许读或只允许写则可使用property-read/property-write变体。为什么会被报告原文档给出的原因如下代码读取了一个通过property-writePHPDoc 标签声明为只写的属性。只写属性的设计目的是接收值而不是被读取。读取它是不被允许的因为类无法保证在访问该属性时返回一个有意义的、约定的值。从语义上讲property-write向 PHPStan 传递的契约是该属性只有写的方向是受支持且可靠的。如果你在代码中读取它实际上是在依赖一个类从未承诺过的行为——这类依赖在真实运行中可能得到未定义的结果例如__get未实现、动态属性未初始化、或返回了无意义的数据。PHPStan 在静态分析阶段提前发现这种契约与用法不匹配的问题帮助开发者避免潜在的运行时缺陷。从源码结构看注册表将本错误映射到ReadingWriteOnlyPropertiesRule读取只写属性规则该规则位于 PHPStan 的Rules\Properties命名空间下与属性读写相关的其他规则如OverridingPropertyRule、ReadingWriteOnlyPropertiesRule等并列说明它是属性契约校验规则族中的一员。如何修复原文档提供了两种标准修复方案按需二选一。方案一属性本就应可读可写——改用property如果该属性实际需要同时支持读和写直接把标签从property-write改为property即可/** - * property-write int $writeOnlyProperty * property int $writeOnlyProperty */ #[\AllowDynamicProperties] class Fooproperty声明的是双向属性既能读取也能写入。改为该标签后echo $this-writeOnlyProperty;不再违反契约错误自然消除。方案二属性确实只写——重构读取路径如果属性确实应该保持只写那么需要修改业务代码避免直接读取它。原文档建议使用另一个属性或方法对外暴露该值例如新增一个property-read的只读属性/** * property-write int $writeOnlyProperty * property-read int $readableProperty */ #[\AllowDynamicProperties] class Foo { public function doFoo(): void { - echo $this-writeOnlyProperty; echo $this-readableProperty; } }这里通过property-read int $readableProperty声明一个方向相反的只读属性让读取行为落到有契约保障的属性上既保留了只写属性的防读取设计又为读取需求提供了合规出口。与相关错误标识符的对照property.writeOnly并非孤立存在它和读写契约相关的其他标识符共同构成了 PHPStan 的属性方向校验体系对照阅读有助于加深理解标识符含义关联文档property.writeOnly读取了property-write声明的只写属性property.writeOnly.mdassign.propertyReadOnly给property-read声明的只读属性赋值assign.propertyReadOnly.mdproperty.readOnly子类用readonly覆盖父类可读写属性违反 Liskov 替换原则property.readOnly.md三者分别从只写属性被读、只读属性被写、只读覆盖读写三个角度约束属性访问方向。其中 assign.propertyReadOnly.md 的示例与本文互为镜像前者展示了对property-read属性执行$this-readOnlyProperty 1;赋值而报错修复方式同样是改用property允许双向访问——可见property-write与property-read是同一机制的两个对称方向PHPStan 对二者的越界访问读只写、写只读都会报错。如何配置与忽略由于property.writeOnly的ignorable为true当你在项目中暂时无法立即重构代码时可以按标识符将其加入忽略清单例如在phpstan.neon中parameters: ignoreErrors: - identifier: property.writeOnly按 identifier 忽略比按错误消息文本匹配更精确、更稳定且无需书写容易失效的正则表达式。不过需要注意忽略只是临时手段推荐优先采用上文两种方案从源码层面修复保持只写/只读契约的正确性。小结property.writeOnly是 PHPStan 针对读取property-write只写属性这一契约违反行为的错误标识符检测规则为ReadingWriteOnlyPropertiesRule元数据位于 website/src/errorsIdentifiers.json修复思路两条属性需双向访问则改用property属性保持只写则重构代码、通过property-read或方法提供可读出口该错误支持ignorable可按 identifier 精确忽略但应优先修复源码而非压制错误。通过正确区分property、property-read、property-write三种方向语义你可以在 PHPDoc 中精确表达类的属性契约让 PHPStan 帮你守住读只写、写只读的边界从源头减少运行时的不确定行为。赞分享开发工具代码质量静态分析【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址https://gitcode.com/gh_mirrors/ph/phpstan点击查看免费下载相关推荐WeKnora Claw Skill 接入指南让 OpenClaw 生态智能体直接上传文档、导入网页与跨库检索WeKnora Claw Skill 接入指南让 OpenClaw 生态智能体直接上传文档、导入网页与跨库检索 Claw Skill 是 WeKnora 面向开发工具代码质量静态分析PHPStan 错误标识符 class.nonReadOnly 详解非只读类继承 readonly 类的检测与修复PHPStan 错误标识符 class.nonReadOnly 详解非只读类继承 readonly 类的检测与修复 导读 class.nonReadOnly开发工具代码质量静态分析PHPStan 错误标识符 property.readWrite 详解可写属性覆盖父类 readonly 属性的检测与修复PHPStan 错误标识符 property.readWrite 详解可写属性覆盖父类 readonly 属性的检测与修复 本篇技术指南围绕 PHPStan开发工具代码质量静态分析上一篇Mastra 可观测性 Traces 测试指南从本地冒烟测试到云端 Trace 管线验证下一篇深入解析 GLM-ImageDiffusers 中的混合自回归 扩散解码图像生成管线创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

FileZilla 快捷键速查手册:30 个核心键盘操作完整解析

FileZilla 快捷键速查手册:30 个核心键盘操作完整解析

FileZilla 快捷键速查手册:30 个核心键盘操作完整解析 【免费下载链接】reference ⭕ Share quick reference cheat sheet for developers. 项目地址: https://gitcode.com/gh_mirrors/re/reference FileZilla 是开发者与系统管理员最常用的开源 FTP/SFTP 客…

2026/9/24 17:18:24 阅读更多 →
一文搞懂openYuanrong:openEuler开源Serverless分布式计算引擎终极入门指南

一文搞懂openYuanrong:openEuler开源Serverless分布式计算引擎终极入门指南

一文搞懂openYuanrong:openEuler开源Serverless分布式计算引擎终极入门指南 【免费下载链接】yuanrong openYuanrong runtime:openYuanrong 多语言运行时提供函数分布式编程,支持 Python、Java、C 语言,实现类单机编程高性能分布式…

2026/9/24 17:18:24 阅读更多 →
Modin pandas on Dask 使用指南:引擎配置、集群运行与 DataFrame 互转

Modin pandas on Dask 使用指南:引擎配置、集群运行与 DataFrame 互转

数据分析数据工程大数据 【免费下载链接】modin Modin: Scale your Pandas workflows by changing a single line of code 项目地址: https://gitcode.com/gh_mirrors/mo/modin 点击查看 免费下载 本篇技术指南以仓库文档 docs/development/using_pandas_on_dask.r…

2026/9/24 17:18:24 阅读更多 →

最新新闻

基于Java开发的小程序地图定位:从后端签名到前端选点完整链路

基于Java开发的小程序地图定位:从后端签名到前端选点完整链路

简介:这是一份面向Java后端开发者与小程序入门者的实战型项目源码,围绕「小程序地图定位」这一常见移动场景,演示如何用Java技术栈配合前端完成位置服务。资源共38个文件,以15张png界面截图与图标、6个js逻辑脚本、5个wxss样式、4…

2026/9/24 18:53:29 阅读更多 →
Windows 部署 OpenClaw 实操记录,避开环境配置各类坑点

Windows 部署 OpenClaw 实操记录,避开环境配置各类坑点

OpenClaw 一体化安装包|可视化部署,简化 AI 自动化环境搭建 传统 AI 自动化工具部署流程繁琐,需要手动配置各类运行环境,对于不熟悉开发的用户门槛很高。OpenClaw 整合全套依赖,提供一体化安装包,通过图形…

2026/9/24 18:53:29 阅读更多 →
IO多路复用精讲:从select/poll到epoll高并发实战TCP回显服务器

IO多路复用精讲:从select/poll到epoll高并发实战TCP回显服务器

做Linux网络编程的人,迟早会碰到IO多路复用这个词。不管是写高并发服务端、嵌入式socket应用,还是准备面试,select、poll、epoll这三个东西都绕不开。作为系列第二篇,我会直接按工程落地的思路来讲:先把这个东西解决的…

2026/9/24 18:53:29 阅读更多 →
Hashcat实战:数据库提权场景下的口令破解与安全审计经验

Hashcat实战:数据库提权场景下的口令破解与安全审计经验

我把自己这几年做授权渗透测试和口令安全审计时用Hashcat的经验完整梳理了一遍。这篇文章不打算写成工具手册式的罗列,而是按真实项目里的思考路径来走:拿到哈希之后怎么判断形态、怎么选攻击方式、怎么设计掩码和规则、遇到瓶颈怎么调、踩过哪些坑。全程…

2026/9/24 18:53:29 阅读更多 →
OpenClaw容器化部署全指南:从Docker环境准备到常见报错排查

OpenClaw容器化部署全指南:从Docker环境准备到常见报错排查

最近身边好几个做AI应用的朋友都在折腾OpenClaw,这项目本质上是个把大模型API、消息渠道、会话管理、记忆存储全部串起来的Agent框架。它对运行环境的依赖相当挑——Python版本、Node版本、系统库版本稍微对不上,启动时就会冒出各种奇怪的报错。我的建议…

2026/9/24 18:53:29 阅读更多 →
测试环境管理实战:用GitLab CI/CD和Docker Engine打造动态测试环境

测试环境管理实战:用GitLab CI/CD和Docker Engine打造动态测试环境

聊到CI/CD优化,很多人第一反应是压缩流水线时间:并行执行、缓存依赖、精简镜像。我做了几年持续交付落地,发现真正拖垮交付效率的,往往不是流水线本身,而是下游那个不起眼的“接收站”——测试环境管理。代码构建从10分…

2026/9/24 18:52:29 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →