资讯动态

PHP-FIG PSR-2 编码风格规范全解:从规则清单、代码示例到成员项目调查(fig-standards)

发布时间:2026/10/6 12:23:41 来源:尧图企业网站定制
文档开发工具【免费下载链接】fig-standardsStandards either proposed or approved by the Framework Interop Group项目地址https://gitcode.com/gh_mirrors/fi/fig-standards点击查看免费下载导读PSR-2Coding Style Guide是 PHP Framework Interop GroupPHP-FIG于 2012 年通过的编码风格规范其核心目标是通过一套共享的代码格式化规则降低开发者阅读不同作者代码时的认知摩擦。本文以 fig-standards 仓库中的 accepted/PSR-2-coding-style-guide.md 为骨架完整继承并逐条展开其全部规范缩进、行宽、命名空间、类/方法/属性、控制结构、闭包同时结合仓库中的 PSR-1 基础规范、PSR-2 meta 文档、PSR-12 扩展规范 与 PSR 索引讲清规则背后的设计动机、历史沿革与迁移路径。读完本文你将能够按 PSR-2 的每条 MUST / SHOULD / MAY 要求审查和格式化 PHP 代码理解规范中每一处括号、空格、空行背后的约束逻辑并知道它为何在 2019 年被 PSR-12 取代、如何平滑迁移。1. 规范背景与仓库定位1.1 PSR-2 是什么PSR-2 全称Coding Style Guide编码风格指南由 PHP-FIG 制定并维护存放于 fig-standards 仓库的 accepted/PSR-2-coding-style-guide.md。它扩展并承接 PSR-1Basic Coding Standard即 PSR-2 的读者被假定已遵守 PSR-1 的全部基础规则PHP 标签、UTF-8 编码、文件副作用约束、StudlyCaps 类名、全大写常量、camelCase 方法名等PSR-2 在此之上进一步规定代码如何排版。规范的意图在文档开篇即被明确本指南的目的是降低扫描不同作者代码时的认知摩擦cognitive friction其手段是枚举一套共享的、关于 PHP 代码如何格式化的规则与预期。值得注意的是这些风格规则并非凭空发明而是从成员项目的共同实践中提炼而来这一过程的实证数据保留在文档的 Appendix A 调查附录 中。当不同作者跨项目协作时统一的规则集能显著减少因风格差异造成的阅读负担因此本指南的收益不在于规则本身而在于规则被共享这一事实。1.2 状态与替代为什么还要读 PSR-2原文档第 1 行即标注了弃用声明Deprecated- As of 2019-08-10 PSR-2 has been marked as deprecated. [PSR-12] is now recommended as an alternative.在 PSR.md 的状态索引中PSR-2 也被明确列入Deprecated已弃用一类与之并列的还有 PSR-0自动加载标准。PSR-2 的继承者是 PSR-12Extended Coding Style Guide后者在 PSR-2 的基础上补充了 PHP 5.5 / 5.6 / 7.0 时代新增语言特性标量类型声明、declare(strict_types1)、匿名类、函数/常量导入、返回类型等的排版规则并把 PSR-2 的官方 Errata见第 9 节变为强制性条款。为什么今天仍要研读 PSR-2其一PSR-12 明确声明以 PSR-2 为基底PSR-12 meta 文档 指出 PSR-12 以 PSR-2 的风格、理由与立场为准绳而非另立新规其二PSR-2 是 PHP 生态中影响最广的格式规范之一大量存量代码、工具链配置与文档仍以其为参照其三PSR-2 的规则理由调查数据三位一体结构是理解 PHP-FIG 制定规范方法论的最佳样本。本文的解读即同时面向直接使用 PSR-2与以 PSR-2 理解 PSR-12两种场景。1.3 关键词语义RFC 2119与仓库中所有 PSR 文档一致原文档使用 RFC 2119 定义的关键词表达约束强度MUST / MUST NOT绝对要求 / 绝对禁止等价于 REQUIRED / SHALL / SHALL NOTSHOULD / SHOULD NOT强烈建议 / 强烈不建议在特殊且合理的情况下可以违背但须理解并权衡后果MAY / OPTIONAL完全可选由作者自行决定。下文逐条规则均以这些关键词标注其约束等级。2. Overview13 条总则与速览示例原文档第 1 节用 13 条要点勾勒了整份规范的全貌它们是全篇的浓缩代码MUST遵循 PSR-1 这一基础编码规范缩进MUST使用 4 个空格MUST NOT使用制表符Tab行长度MUST NOT有硬性上限软上限MUST为 120 字符行SHOULD不超过 80 字符namespace声明之后MUST有一个空行use声明块之后MUST有一个空行类的左花括号MUST独占一行右花括号MUST位于方法体之后的下一行方法的左花括号MUST独占一行右花括号MUST位于方法体之后的下一行所有属性与方法MUST声明可见性visibilityabstract与finalMUST位于可见性之前staticMUST位于可见性之后控制结构关键字之后MUST有一个空格方法/函数调用MUST NOT有空格控制结构的左花括号MUST位于同一行右花括号MUST位于结构体之后的下一行控制结构的左圆括号之后MUST NOT有空格右圆括号之前MUST NOT有空格。这些总则的类/方法独占一行大括号 vs 控制结构同行大括号的对比正是 PSR-2 最具辨识度的排版特征。2.1 速览示例文档原例原文档用下面这段代码一次性呈现了多数规则namespace 空行、use 块空行、类与方法大括号换行、控制结构大括号同行、关键字后空格、调用无空格、修饰符顺序?php namespace Vendor\Package; use FooInterface; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class Foo extends Bar implements FooInterface { public function sampleMethod($a, $b null) { if ($a $b) { bar(); } elseif ($a $b) { $foo-bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // method body } }对照总则逐点核对use块后空行、class大括号换行、方法大括号换行、if/elseif/else同行大括号、final public static的修饰符顺序final在前、static在可见性之后无一例外。3. General通用规则详解第 2 节将通用规则细分为五个子项。3.1 基础编码规范2.1代码MUST遵守 PSR-1Basic Coding Standard 中的全部规则。要点包括文件只能使用?php与?标签、仅使用无 BOM 的 UTF-8、文件要么声明符号要么产生副作用但不得两者兼有、类名 StudlyCaps、常量全大写加下划线分隔、方法名 camelCase。3.2 文件规则2.2所有 PHP 文件MUST使用 Unix LF换行符行结尾所有 PHP 文件MUST以单个空行结束仅含 PHP 代码的文件MUST省略收尾的?标签。省略?的理由是防御性设计一旦?之后存在任何空白或字符包括换行输出就会先于后续代码被发送导致Cannot modify header information一类问题。这一点在 PSR-1 的文件不得产生副作用精神下被进一步强化而 PSR-12 甚至将以单个 LF 结尾的非空行进一步收紧为唯一合法收尾。3.3 行规则2.3行长MUST NOT设置硬性上限软上限MUST为 120 字符自动化风格检查器在软上限处 MUST 给出警告warn但 MUST NOT 报错error——这一条为工具实现划定了行为边界行SHOULD NOT超过 80 字符超过时SHOULD拆分为多行每行不超过 80 字符非空行的行尾MUST NOT存在尾随空白trailing whitespaceMAY使用空行提升可读性、标识相关代码块每行MUST NOT出现超过一条语句。软/硬限制的分离是本节的精妙之处120 字符软上限保证工具可告警而不阻塞80 字符建议保留人类阅读的舒适区而无硬上限则避免了对长 URL、长字符串字面量等无法优雅拆分的场景一刀切。3.4 缩进规则2.4代码MUST使用 4 个空格缩进MUST NOT使用制表符缩进。原文档专门给出了一条编者注N.b.仅使用空格、且不将空格与制表符混用有助于避免 diff、补丁、历史记录与注释中出现问题使用空格也便于在行间对齐时插入更细粒度的子缩进。纯空格策略保证同一文件在任何编辑器、任何终端宽度下渲染一致避免制表符宽度配置差异导致的对齐错乱。3.5 关键字与 true/false/null2.5PHP [关键字]keywords如if、for、class、function等MUST全部小写PHP 常量true、false、nullMUST全部小写即不允许TRUE/False之类的大小写变体。这与调查中 22 个成员项目里 19 个使用小写true/false/null的共识一致见 第 10 节。4. Namespace 与 use 声明第 3 节规定文件头部命名空间与导入块import block的排版存在namespace声明时其后MUST有一个空行存在use声明时所有use声明MUST位于namespace声明之后每个声明MUST使用独立的use关键字即一行一个 importuse块之后MUST有一个空行。标准形态示例文档原例?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; // ... additional PHP code ...注意三个细节类名别名as Bar允许use块与后续代码之间保留空行use与namespace之间也以空行分隔。PSR-2 只规定类名导入而函数导入use function与常量导入use const是 PHP 5.6 之后的新特性属于 PSR-12 的补充范畴。5. 类、属性与方法第 4 节是整份规范中篇幅最大的部分。原文档特别注明本节中类class一词涵盖所有类、接口interface与 trait。5.1 extends 与 implements4.1extends与implements关键字MUST与类名位于同一行类的左花括号MUST独占一行下一行右花括号MUST位于类体之后的下一行。单行形态文档原例?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class ClassName extends ParentClass implements \ArrayAccess, \Countable { // constants, properties, methods }implements列表MAY跨多行拆分每个后续行缩进一次拆分时第一项MUST位于下一行且每行MUST只含一个接口?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class ClassName extends ParentClass implements \ArrayAccess, \Countable, \Serializable { // constants, properties, methods }5.2 属性4.2所有属性MUST声明可见性public/protected/privateMUST NOT使用var关键字声明属性PHP 4 遗留语法会绕过可见性要求每条语句MUST NOT声明超过一个属性属性名SHOULD NOT使用单个下划线前缀来暗示 protected 或 private 可见性可见性应由关键字显式表达而非靠命名约定暗示。标准声明文档原例?php namespace Vendor\Package; class ClassName { public $foo null; }5.3 方法4.3所有方法MUST声明可见性方法名SHOULD NOT使用单个下划线前缀暗示可见性方法名之后MUST NOT有空格左花括号MUST独占一行右花括号MUST位于方法体之后的下一行左圆括号之后MUST NOT有空格右圆括号之前MUST NOT有空格。标准形态文档原例注意圆括号、逗号、空格与大括号的排布?php namespace Vendor\Package; class ClassName { public function fooBarBaz($arg1, $arg2, $arg3 []) { // method body } }5.4 方法参数4.4参数列表中每个逗号之前MUST NOT有空格每个逗号之后MUST有一个空格带默认值的参数MUST位于参数列表末尾。基础示例文档原例?php namespace Vendor\Package; class ClassName { public function foo($arg1, $arg2, $arg3 []) { // method body } }参数列表MAY跨多行拆分每个后续行缩进一次拆分时第一项MUST位于下一行且每行MUST只含一个参数。当参数列表跨行拆分时右圆括号与左花括号 MUST 同处一行二者之间用一个空格分隔) {?php namespace Vendor\Package; class ClassName { public function aVeryLongMethodName( ClassTypeHint $arg1, $arg2, array $arg3 [] ) { // method body } }这一) {同行形态是 PSR-2 对长参数列表的既定解法它同时满足方法大括号换行仅在参数跨行时例外与参数逐行一个两条约束也是后续 PSR-12 与 PSR-2 保持一致的排版点。5.5 abstract、final 与 static4.5修饰符顺序是 PSR-2 的经典规定也是一道高频面试题存在abstract/final时二者MUST位于可见性声明之前存在static时staticMUST位于可见性声明之后。即合法顺序为abstract|final→ 可见性 →static。示例文档原例?php namespace Vendor\Package; abstract class ClassName { protected static $foo; abstract protected function zim(); final public static function bar() { // method body } }属性protected static $foo同样遵循可见性在前、static 在后的顺序。5.6 方法调用与函数调用4.6方法/函数名与左圆括号之间MUST NOT有空格左圆括号之后MUST NOT有空格右圆括号之前MUST NOT有空格参数列表中逗号之前MUST NOT有空格逗号之后MUST有一个空格。基础形态文档原例?php bar(); $foo-bar($arg1); Foo::bar($arg2, $arg3);参数列表MAY跨多行拆分每行一个参数、后续行缩进一次首项位于下一行?php $foo-bar( $longArgument, $longerArgument, $muchLongerArgument );官方 Errata 3.1 的补充见 PSR-2 meta 文档只要参数本身是多行结构如数组字面量、匿名函数就不算拆分参数列表本节规则不强制适用。换言之下面两种写法在 PSR-2 下完全合法?php somefunction($foo, $bar, [ // ... ], $baz); $app-get(/hello/{name}, function ($name) use ($app) { return Hello .$app-escape($name); });6. 控制结构Control Structures第 5 节给出了控制结构的通用风格规则控制结构关键字之后MUST有一个空格左圆括号之后MUST NOT有空格右圆括号之前MUST NOT有空格右圆括号与左花括号之间MUST有一个空格结构体MUST缩进一次右花括号MUST位于结构体之后的下一行。每个结构的体 MUST 用花括号包裹即使只有一行。原文档给出了理由这统一了结构外观并降低未来向结构体追加新行时引入错误的概率避免少加括号类 bug。6.1 if / elseif / else5.1?php if ($expr1) { // if body } elseif ($expr2) { // elseif body } else { // else body; }关键排版点else与elseif必须与上一结构体的右花括号同一行。此外规范明确应优先使用elseif而非else if以使所有控制关键字看起来像单个单词else if会被解释成else后接嵌套if两分支语义相同但外观割裂。6.2 switch / case5.2?php switch ($expr) { case 0: echo First case, with a break; break; case 1: echo Second case, which falls through; // no break case 2: case 3: case 4: echo Third case, return instead of break; return; default: echo Default case; break; }排版要点case从switch缩进一次break或其他终止关键字与case体缩进在同一层级当非空case体有意贯穿fall-through到下一个 case 时MUST 添加// no break之类的注释。注意空 case 体如case 2:、case 3:可以连续排列无需终止关键字。6.3 while 与 do while5.3?php while ($expr) { // structure body }?php do { // structure body; } while ($expr);do...while中while ($expr)与右花括号同行、;收尾。6.4 for5.4?php for ($i 0; $i 10; $i) { // for body }6.5 foreach5.5?php foreach ($iterable as $key $value) { // foreach body }6.6 try / catch5.6?php try { // try body } catch (FirstExceptionType $e) { // catch body } catch (OtherExceptionType $e) { // catch body }多个catch块依次排列} catch同行异常类型与变量之间用空格分隔。7. 闭包Closures第 6 节专门规定匿名函数闭包的排版function关键字之后MUST有一个空格use关键字前后MUST各有一个空格左花括号MUST位于同一行与参数列表同行右花括号MUST位于方法体之后的下一行参数列表或变量列表的左圆括号之后MUST NOT有空格右圆括号之前MUST NOT有空格参数列表与变量列表中逗号之前MUST NOT有空格、逗号之后MUST有一个空格带默认值的闭包参数MUST位于参数列表末尾。基础形态文档原例?php $closureWithArgs function ($arg1, $arg2) { // body }; $closureWithArgsAndVars function ($arg1, $arg2) use ($var1, $var2) { // body };参数列表与变量列表MAY跨多行拆分每行一项、缩进一次当结尾的列表无论参数还是变量跨行时右圆括号与左花括号 MUST 同处一行之间一个空格。原文档给出的五种组合示例?php $longArgs_noVars function ( $longArgument, $longerArgument, $muchLongerArgument ) { // body }; $noArgs_longVars function () use ( $longVar1, $longerVar2, $muchLongerVar3 ) { // body }; $longArgs_longVars function ( $longArgument, $longerArgument, $muchLongerArgument ) use ( $longVar1, $longerVar2, $muchLongerVar3 ) { // body }; $longArgs_shortVars function ( $longArgument, $longerArgument, $muchLongerArgument ) use ($var1) { // body }; $shortArgs_longVars function ($arg) use ( $longVar1, $longerVar2, $muchLongerVar3 ) { // body };当闭包直接作为函数/方法调用的参数使用时上述格式规则同样适用文档原例?php $foo-bar( $arg1, function ($arg2) use ($var1) { // body }, $arg3 );即调用参数列表中多行闭包作为一个参数存在其内部仍按闭包规则排版。8. 规范刻意未覆盖的内容Conclusion第 7 节坦诚列出了 PSR-2 有意省略的风格与实践要素这些内容交由未来修订扩展全局变量与全局常量的声明函数function的声明运算符与赋值operators and assignment行间对齐inter-line alignment注释与文档块comments and documentation blocks类名前缀与后缀最佳实践best practices。这份未覆盖清单的意义在于界定规范边界PSR-2 聚焦排版不越界指导架构与工程实践。后续的 PSR-12 在继承这些边界的同时把新语言特性的排版补全并承诺未来修订 MAY 进一步扩展本指南。9. Errata 与演进从 PSR-2 到 PSR-129.1 PSR-2 官方 Errata规范通过后PSR-2 meta 文档 记录了后续澄清Errata。由于 Errata 只能写入 meta 文档而非规范正文阅读 PSR-2 时这两份文件必须配套使用Errata 3.1 – 多行参数2013-09-08使用一个或多个多行参数如数组或匿名函数并不构成对参数列表本身的拆分因此第 4.6 节不被自动强制数组与匿名函数可以跨越多行示例见第 5.6 节。Errata 3.2 – 扩展多个接口2013-10-17当类扩展多个接口时extends列表应按照第 4.1 节中implements列表的规则处理可跨行、每行一个接口、首项换行。9.2 PSR-12 的定位与 PSR-2 的迁移价值PSR-12 规范 在 Overview 中明确它扩展、扩展并取代PSR-2同时要求遵守 PSR-1。其背景详见 PSR-12 meta 文档是PSR-2 于 2012 年通过此后 PHP 5.5 / 5.6 / 7.0 引入了大量新语法标量类型、declare(strict_types1)、use function/use const、返回类型、匿名类等PSR-2 对这些新特性开放解释导致风格工具与项目各自为政PSR-12 将 PSR-2 的 Errata 变为强制性条款并对新特性给出确定规则。对于读者而言两条实用结论新项目直接采用 PSR-12它是当前 PSR.md 索引中状态为 Accepted 的编码规范阅读/维护 PSR-2 风格存量代码时PSR-2 的规则几乎全部原样继承进 PSR-12PSR-12 的文件头还增加了declare语句块、文件级 docblock 与函数/常量导入的顺序规定并将文件以单个 LF 结尾的非空行结束取代 PSR-2 的以单个空行结束。因此掌握本文的每一条规则就是掌握了 PSR-12 的绝大部分排版基础。规范的生命周期Pre-Draft → Draft → Review → Accepted → Deprecated在 bylaws/002-psr-workflow.md 中有完整定义PSR-2 正是经由该流程在 2019-08-10 被正式标记为 Deprecated。10. 附录 A成员项目风格调查Survey原文档在制定过程中对成员项目进行了风格实践调查数据完整保留在文档附录 A 中用于佐证规则源自共识。10.1 调查图例Legendindent_type缩进类型tab 使用制表符2/4 使用相应数量的空格line_length_limit_soft/hard软/硬行长限制字符数? 无法辨识或无回复no 无限制class_names类命名lower 全小写lower_under 小写加下划线分隔studly StudlyCaseclass_brace_line/method_brace_line/control_brace_line类/方法/控制结构的左花括号位于same同行还是next下一行constant_names类常量命名upper 全大写加下划线分隔true_false_nulltrue/false/null全部lower小写还是upper大写method_names方法命名camel camelCaselower_under 小写加下划线分隔control_space_after控制结构关键字后是否有空格always_use_control_braces控制结构是否总使用花括号else_elseif_lineelse/elseif与前一右花括号same同行还是next下一行case_break_indent_from_switchcase与break相对switch的缩进次数如1/2表示 case 缩进 1 次、break 缩进 2 次function_space_after函数调用时函数名与左圆括号之间是否有空格closing_php_tag_required纯 PHP 文件是否要求收尾?标签line_endings行结尾类型LF 等static_or_visibility_first方法声明中static在前还是可见性在前either 均可control_space_parens控制结构圆括号内是否有空格yesif ( $expr )noif ($expr)blank_line_after_php开头的?php标签之后是否有空行class_method_control_brace类、方法、控制结构左花括号所在行的汇总如next/next/same。10.2 调查结果统计共 22 个成员项目调查项选项分布数量indent_typetab: 72 空格: 14 空格: 14line_length_limit_soft?: 2no: 375: 480: 685: 1100: 1120: 4150: 1line_length_limit_hard?: 2no: 1185: 4100: 3120: 2class_names?: 1lower: 1lower_under: 1studly: 19class_brace_linenext: 16same: 6constant_namesupper: 22true_false_nulllower: 19upper: 3method_namescamel: 21lower_under: 1method_brace_linenext: 15same: 7control_brace_linenext: 4same: 18control_space_afterno: 2yes: 20always_use_control_bracesno: 3yes: 19else_elseif_linenext: 6same: 16case_break_indent_from_switch0/1: 41/1: 41/2: 14function_space_afterno: 22closing_php_tag_requiredno: 19yes: 3line_endings?: 5LF: 17static_or_visibility_first?: 5either: 7static: 4visibility: 6control_space_parens?: 1no: 19yes: 2blank_line_after_php?: 1no: 13yes: 8class_method_control_bracenext/next/next: 4next/next/same: 11next/same/same: 1same/same/same: 610.3 从数据反推规则对照统计可以发现 PSR-2 规则与成员项目共识的高度相关性4 空格缩进14/22压倒了制表符7/22最终规则4 空格、禁 Tab由此而来StudlyCaps 类名19/22与camelCase 方法名21/22几乎全票成为 PSR-1 的强制项类大括号换行16/22与控制结构大括号同行18/22是类方法换行、控制结构同行这一 PSR-2 标志性规则的数据来源控制关键字后空格20/22、调用无空格22/22 全票、总用花括号19/22分别对应第 6 节与第 5.6 节省略?19/22对应第 3.2 节static_or_visibility_first分歧较大either 7、static 4、visibility 6PSR-2 最终裁定可见性在前、static 在后是为了与属性声明顺序保持一致并统一预期。这份调查的价值在于证明PSR-2 的每条规则都不是编者独断而是多数成员项目既有实践的提炼与固化——正如原文档所述本指南的收益不在于规则本身而在于规则的共享。11. 实践检查清单将全文规则收敛为一份可直接对照的检查清单适用于手工审查与 CI 中的风格校验思路文件级仅使用?php/?标签UTF-8 无 BOM行结尾为 LF文件以单个空行结束纯 PHP 文件省略?行尾无尾随空白每行至多一条语句头部namespace后空一行use块位于namespace之后、每行一个use、块后空一行类 / 属性 / 方法类大括号换行extends/implements与类名同行长列表可跨行、每行一项属性与方法均显式声明可见性禁用var每行一个属性修饰符顺序abstract/final→ 可见性 →static方法大括号换行参数列表逗号前无空格、后有空格默认值参数置于末尾长参数列表跨行时每行一项)与{同行调用处函数名与(之间无空格、括号内侧无空格控制结构与闭包控制关键字后一个空格括号内侧无空格)与{之间一个空格结构体总用花括号包裹右花括号位于体后下一行elseif优先于else ifelse/elseif与前一}同行switch中case缩进一次、break与 case 体同层fall-through 加// no break注释闭包function后一个空格、use前后各一个空格、大括号同行跨行列表同方法参数规则关键字与true/false/null一律小写迁移提示若你的项目已转向 PSR-12以上绝大多数条目仍然有效需要额外注意 PSR-12 新增的文件头块顺序?php→ 文件级 docblock →declare→namespace→use类/函数/常量导入、strict_types声明与类型关键字简写bool/int而非boolean/integer等新条款。12. 结语PSR-2 虽然已被标记为 Deprecated但它作为 PHP 生态中最有影响力的编码风格规范之一其规则体系、Errata 演进和以调查数据制定标准的方法论至今仍有重要的学习与参照价值。对开发者而言掌握本文涵盖的每一条 MUST / SHOULD 规则既能直接指导 PSR-2 风格代码的编写与审查也是平滑迁移到 PSR-12 的最短路径。深入研读时建议将 PSR-2 规范、PSR-2 meta 文档含 Errata 与编者信息、PSR-1 基础规范 与 PSR-12 扩展规范 四份文件放在一起对照阅读即可获得从基础编码标准到现代 PHP 风格的完整图景。赞分享文档开发工具【免费下载链接】fig-standardsStandards either proposed or approved by the Framework Interop Group项目地址https://gitcode.com/gh_mirrors/fi/fig-standards点击查看免费下载相关推荐fig-standards 仓库 PSR-12 扩展编码风格指南现代 PHP 代码规范完整实战解析fig standards 仓库 PSR 12 扩展编码风格指南现代 PHP 代码规范完整实战解析 PSR 12Extended Coding Style文档开发工具PHP-FIG fig-standards 仓库 PSR-2 Meta 文档解读编码风格统一的设计动机、勘误细则与 PSR-12 演进PHP FIG fig standards 仓库 PSR 2 Meta 文档解读编码风格统一的设计动机、勘误细则与 PSR 12 演进 PSR 2 是 PHP文档开发工具PHP-FIG Standards参考卡片13个核心PSR规范速查表PHP FIG Standards参考卡片13个核心PSR规范速查表 PHP FIGPHP Framework Interop Group制定的PSR规范文档开发工具上一篇如何利用AI技术无损去除视频硬字幕Video-subtitle-remover完全指南下一篇3分钟极速上手免费AI视频字幕去除神器终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑