lbk60ox 发表于 2024-10-5 09:44:33

PHP代码规范


    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">PHP代码规范</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">代码风格规范</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">本规范<span style="color: black;">期盼</span><span style="color: black;">经过</span>制定一系列规范化PHP代码的规则,以减少在浏览<span style="color: black;">区别</span>作者的代码时,因代码风格的<span style="color: black;">区别</span>而<span style="color: black;">导致</span><span style="color: black;">不方便</span>。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">当多名程序员在多个项目中合作时,就需要一个<span style="color: black;">一起</span>的编码规范, 而本文中的风格规范源自于多个<span style="color: black;">区别</span>项目代码风格的<span style="color: black;">一起</span>特性, <span style="color: black;">因此呢</span>,本规范的价值在于<span style="color: black;">咱们</span>都遵循这个编码风格,而不是在于它本身。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">关键词 “必须”("MUST")、“<span style="color: black;">必定</span>不可/<span style="color: black;">必定</span><span style="color: black;">不可</span>”("MUST NOT")、“需要”("REQUIRED")、 “将会”("SHALL")、“不会”("SHALL NOT")、“应该”("SHOULD")、“<span style="color: black;">不应</span>”("SHOULD NOT")、 “<span style="color: black;">举荐</span>”("RECOMMENDED")、“<span style="color: black;">能够</span>”("MAY")和”可选“("OPTIONAL")的<span style="color: black;">仔细</span>描述可参见 RFC 2119 。</p>概览代码<strong style="color: blue;">必须</strong>遵循 PSR-1 中的编码规范 。代码<strong style="color: blue;">必须</strong><span style="color: black;">运用</span>4个空格符而不是 tab键 进行缩进。每行的字符数<strong style="color: blue;">应该</strong>软性保持在80个之内, 理论上<strong style="color: blue;"><span style="color: black;">必定</span>不可</strong>多于120个, 但<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有硬性限制。<span style="color: black;">每一个</span> <span style="color: black;">namespace</span> 命名空间声明语句和 <span style="color: black;">use</span> 声明语句块后面,<strong style="color: blue;">必须</strong><span style="color: black;">插进</span>一个空白行。类的<span style="color: black;">起始</span>花括号(<span style="color: black;">{</span>)<strong style="color: blue;">必须</strong>写在其声明后自成一行,结束花括号(<span style="color: black;">}</span>)<span style="color: black;">亦</span><strong style="color: blue;">必须</strong>写在其主体后自成一行。<span style="color: black;">办法</span>的<span style="color: black;">起始</span>花括号(<span style="color: black;">{</span>)<strong style="color: blue;">必须</strong>写在函数声明后自成一行,结束花括号(<span style="color: black;">}</span>)<span style="color: black;">亦</span><strong style="color: blue;">必须</strong>写在函数主体后自成一行。类的属性和<span style="color: black;">办法</span><strong style="color: blue;">必须</strong>添加<span style="color: black;">拜访</span>修饰符(<span style="color: black;">private</span>、<span style="color: black;">protected</span> 以及 <span style="color: black;">public</span>), <span style="color: black;">abstract</span> 以及 <span style="color: black;">final</span> <strong style="color: blue;">必须</strong>声明在<span style="color: black;">拜访</span>修饰符之前,而 <span style="color: black;">static</span> <strong style="color: blue;">必须</strong>声明在<span style="color: black;">拜访</span>修饰符之后。<span style="color: black;">掌控</span>结构的关键字后<strong style="color: blue;">必须</strong>要有一个空格符,而调用<span style="color: black;">办法</span>或函数时则<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有。<span style="color: black;">掌控</span>结构的<span style="color: black;">起始</span>花括号(<span style="color: black;">{</span>)<strong style="color: blue;">必须</strong>写在声明的同一行,而结束花括号(<span style="color: black;">}</span>)<strong style="color: blue;">必须</strong>写在主体后自成一行。<span style="color: black;">掌控</span>结构的<span style="color: black;">起始</span>左括号后和结束右括号前,都<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有空格符。<h1 style="color: black; text-align: left; margin-bottom: 10px;">1.1. 例子</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">以下例子程序简单地展示了以上大部分规范:</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">namespace</span> <span style="color: black;">Vendor</span>\<span style="color: black;">Package</span>;

      <span style="color: black;">use</span> <span style="color: black;">FooInterface</span>;
      <span style="color: black;">use</span> <span style="color: black;">BarClass</span> <span style="color: black;">as</span> <span style="color: black;">Bar</span>;
      <span style="color: black;">use</span> <span style="color: black;">OtherVendor</span>\<span style="color: black;">OtherPackage</span>\<span style="color: black;">BazClass</span>;

      <span style="color: black;"><span style="color: black;">class</span> <span style="color: black;">Foo</span> <span style="color: black;">extends</span> <span style="color: black;">Bar</span> <span style="color: black;">implements</span> <span style="color: black;">FooInterface</span>
      </span>{
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">sampleFunction</span><span style="color: black;">($a, $b = null)</span>
      </span>{
      <span style="color: black;">if</span> ($a === $b) {
      bar();
      } <span style="color: black;">elseif</span>($a &gt; $b) {
      $foo-&gt;bar($arg1);
      }<span style="color: black;">else</span> {
      BazClass::bar($arg2, $arg3);
      }
      }

      <span style="color: black;">final</span> <span style="color: black;">public</span> <span style="color: black;">static</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">bar</span><span style="color: black;">()</span>
      </span>{
      <span style="color: black;">// method body</span>}
      }</span>通则<h1 style="color: black; text-align: left; margin-bottom: 10px;">2.1 基本编码准则</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">代码<strong style="color: blue;">必须</strong>符合 PSR-1 中的所有规范。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">2.2 文件</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">所有PHP文件<strong style="color: blue;">必须</strong><span style="color: black;">运用</span><span style="color: black;">Unix LF (linefeed)</span><span style="color: black;">做为</span>行的结束符。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">所有PHP文件<strong style="color: blue;">必须</strong>以一个空白行<span style="color: black;">做为</span>结束。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">纯PHP代码文件<strong style="color: blue;">必须</strong>省略最后的 <span style="color: black;">?&gt;</span> 结束标签。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">2.3. 行</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">行的长度<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有硬性的约束。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">软性的长度约束<strong style="color: blue;"><span style="color: black;">必定</span></strong>要限制在120个字符以内,若超过此长度,带代码规范<span style="color: black;">检测</span>的编辑器<strong style="color: blue;"><span style="color: black;">必定</span></strong>要发出警告,<span style="color: black;">不外</span><strong style="color: blue;"><span style="color: black;">必定</span>不可</strong>发出错误提示。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">每行<strong style="color: blue;"><span style="color: black;">不该</span>该</strong>多于80个字符,大于80字符的行<strong style="color: blue;">应该</strong>折成多行。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">非空行后<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有多余的空格符。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">空行<strong style="color: blue;"><span style="color: black;">能够</span></strong>使得阅读代码更加方便以及有助于代码的分块。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">每行<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>存在多于一条语句。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">2.4. 缩进</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">代码<strong style="color: blue;">必须</strong><span style="color: black;">运用</span>4个空格符的缩进,<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>用 tab键 。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">备注: <span style="color: black;">运用</span>空格而不是tab键缩进的好处在于, 避免在比较代码差异、打补丁、重阅代码以及注释时产生混淆。 并且,<span style="color: black;">运用</span>空格缩进,让对齐变得更方便。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">2.5. 关键字 以及 True/False/Null</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">PHP所有 关键字<strong style="color: blue;">必须</strong><span style="color: black;">所有</span>小写。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">常量 <span style="color: black;">true</span> 、<span style="color: black;">false</span> 和 <span style="color: black;">null</span> <span style="color: black;">亦</span><strong style="color: blue;">必须</strong><span style="color: black;">所有</span>小写。</p>namespace 以及 use 声明<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">namespace</span> 声明后 必须 <span style="color: black;">插进</span>一个空白行。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">所有 <span style="color: black;">use</span> 必须 在 <span style="color: black;">namespace</span> 后声明。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">每条 <span style="color: black;">use</span> 声明语句 必须 <span style="color: black;">仅有</span>一个 <span style="color: black;">use</span> 关键词。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">use</span> 声明语句块后 必须 要有一个空白行。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">例如:</p><span style="color: black;"><span style="color: black;">&lt;?php</span>

      <span style="color: black;">namespace</span> <span style="color: black;">Vendor</span>\<span style="color: black;">Package</span>;<span style="color: black;">use</span> <span style="color: black;">FooClass</span>;
      <span style="color: black;">use</span> <span style="color: black;">BarClass</span> <span style="color: black;">as</span> <span style="color: black;">Bar</span>;
      <span style="color: black;">use</span> <span style="color: black;">OtherVendor</span>\<span style="color: black;">OtherPackage</span>\<span style="color: black;">BazClass</span>;
      <span style="color: black;">// ... additional PHP code ...</span>

    </span>类、属性和<span style="color: black;">办法</span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">此处的“类”泛指所有的class类、接口以及traits可复用代码块。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">4.1. 扩展与继承</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">关键词<span style="color: black;">extends</span> 和 <span style="color: black;">implements</span><strong style="color: blue;">必须</strong>写在类名<span style="color: black;">叫作</span>的同一行。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">类的<span style="color: black;">起始</span>花括号<strong style="color: blue;">必须</strong><span style="color: black;">独霸</span>一行,结束花括号<span style="color: black;">亦</span><strong style="color: blue;">必须</strong>在类主体后<span style="color: black;">独霸</span>一行。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>

      <span style="color: black;">namespace</span> <span style="color: black;">Vendor</span>\<span style="color: black;">Package</span>;

      <span style="color: black;">use</span> <span style="color: black;">FooClass</span>;
      <span style="color: black;">use</span> <span style="color: black;">BarClass</span> <span style="color: black;">as</span> <span style="color: black;">Bar</span>;
      <span style="color: black;">use</span> <span style="color: black;">OtherVendor</span>\<span style="color: black;">OtherPackage</span>\<span style="color: black;">BazClass</span>;

      <span style="color: black;"><span style="color: black;">class</span> <span style="color: black;">ClassName</span> <span style="color: black;">extends</span> <span style="color: black;">ParentClass</span> <span style="color: black;">implements</span> \<span style="color: black;">ArrayAccess</span>, \<span style="color: black;">Countable</span>
      </span>{
      <span style="color: black;">// constants, properties, methods</span>
      }
    </span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">implements</span> 的继承列表<span style="color: black;">亦</span><strong style="color: blue;"><span style="color: black;">能够</span></strong>分成多行,<span style="color: black;">这般</span>的话,<span style="color: black;">每一个</span>继承接口名<span style="color: black;">叫作</span>都<strong style="color: blue;">必须</strong><span style="color: black;">掰开</span>独立成行,<span style="color: black;">包含</span><span style="color: black;">第1</span>个。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>

      <span style="color: black;">namespace</span> <span style="color: black;">Vendor</span>\<span style="color: black;">Package</span>;

      <span style="color: black;">use</span> <span style="color: black;">FooClass</span>;
      <span style="color: black;">use</span> <span style="color: black;">BarClass</span> <span style="color: black;">as</span> <span style="color: black;">Bar</span>;
      <span style="color: black;">use</span> <span style="color: black;">OtherVendor</span>\<span style="color: black;">OtherPackage</span>\<span style="color: black;">BazClass</span>;

      <span style="color: black;"><span style="color: black;">class</span> <span style="color: black;">ClassName</span> <span style="color: black;">extends</span> <span style="color: black;">ParentClass</span> <span style="color: black;">implements</span>
            \<span style="color: black;">ArrayAccess</span>,
            \<span style="color: black;">Countable</span>,
            \<span style="color: black;">Serializable</span>
      </span>{
      <span style="color: black;">// constants, properties, methods</span>
      }
    </span>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">4.2. 属性</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">每一个</span>属性都<strong style="color: blue;">必须</strong>添加<span style="color: black;">拜访</span>修饰符。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;"><span style="color: black;">必定</span>不可</strong><span style="color: black;">运用</span>关键字 <span style="color: black;">var</span> 声明一个属性。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">每条语句<strong style="color: blue;"><span style="color: black;">必定</span>不可</strong>定义超过一个属性。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">不要</strong><span style="color: black;">运用</span>下划线<span style="color: black;">做为</span>前缀,来区分属性是 protected 或 private。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">以下是属性声明的一个范例:</p><span style="color: black;"><span style="color: black;">&lt;?php</span>

      <span style="color: black;">namespace</span> <span style="color: black;">Vendor</span>\<span style="color: black;">Package</span>;

      <span style="color: black;"><span style="color: black;">class</span> <span style="color: black;">ClassName</span>
      </span>{
      <span style="color: black;">public</span> $foo = <span style="color: black;">null</span>;
      }
    </span>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">4.3. <span style="color: black;">办法</span></h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">所有<span style="color: black;">办法</span>都<strong style="color: blue;">必须</strong>添加<span style="color: black;">拜访</span>修饰符。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">不要</strong><span style="color: black;">运用</span>下划线<span style="color: black;">做为</span>前缀,来区分<span style="color: black;">办法</span>是 protected 或 private。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">办法</span>名<span style="color: black;">叫作</span>后<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有空格符,其<span style="color: black;">起始</span>花括号<strong style="color: blue;">必须</strong><span style="color: black;">独霸</span>一行,结束花括号<span style="color: black;">亦</span><strong style="color: blue;">必须</strong>在<span style="color: black;">办法</span>主体后单独成一行。参数左括号后和右括号前<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有空格。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">一个标准的<span style="color: black;">办法</span>声明可参照以下范例,留意其括号、逗号、空格以及花括号的位置。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>

      <span style="color: black;">namespace</span> <span style="color: black;">Vendor</span>\<span style="color: black;">Package</span>;

      <span style="color: black;"><span style="color: black;">class</span> <span style="color: black;">ClassName</span>
      </span>{
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">fooBarBaz</span><span style="color: black;">($arg1, &amp;$arg2, $arg3 = [])</span>
      </span>{
      <span style="color: black;">// method body</span>
      }
      }
    </span>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">4.4. <span style="color: black;">办法</span>的参数</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">参数列表中,<span style="color: black;">每一个</span>逗号后面<strong style="color: blue;">必须</strong>要有一个空格,而逗号前面<strong style="color: blue;"><span style="color: black;">必定</span>不能</strong>有空格。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">有默认值的参数,<strong style="color: blue;">必须</strong>放到参数列表的末尾。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>

      <span style="color: black;">namespace</span> <span style="color: black;">Vendor</span>\<span style="color: black;">Package</span>;

      <span style="color: black;"><span style="color: black;">class</span> <span style="color: black;">ClassName</span>
      </span>{
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">foo</span><span style="color: black;">($arg1, &amp;$arg2, $arg3 = [])</span>
      </span>{
      <span style="color: black;">// method body</span>
      }
      }
    </span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">参数列表<strong style="color: blue;"><span style="color: black;">能够</span></strong>分列成多行,<span style="color: black;">这般</span>,<span style="color: black;">包含</span><span style="color: black;">第1</span>个参数在内的<span style="color: black;">每一个</span>参数都<strong style="color: blue;">必须</strong>单独成行。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">拆分成多行的参数列表后,结束括号以及<span style="color: black;">办法</span><span style="color: black;">起始</span>花括号 必须 写在同一行,中间用一个空格分隔。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>

      <span style="color: black;">namespace</span> <span style="color: black;">Vendor</span>\<span style="color: black;">Package</span>;

      <span style="color: black;"><span style="color: black;">class</span> <span style="color: black;">ClassName</span>
      </span>{
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">aVeryLongMethodName</span><span style="color: black;">(
                ClassTypeHint $arg1,
                &amp;$arg2,
                array $arg3 = []
                )</span> </span>{
      <span style="color: black;">// method body</span>
      }
      }
    </span>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">4.5. abstract 、 final 、 以及 static</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">需要添加 <span style="color: black;">abstract</span> 或 <span style="color: black;">final</span> 声明时, <strong style="color: blue;">必须</strong>写在<span style="color: black;">拜访</span>修饰符前,而 <span style="color: black;">static</span> 则<strong style="color: blue;">必须</strong>写在其后。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>

      <span style="color: black;">namespace</span> <span style="color: black;">Vendor</span>\<span style="color: black;">Package</span>;

      <span style="color: black;">abstract</span> <span style="color: black;"><span style="color: black;">class</span> <span style="color: black;">ClassName</span>
      </span>{
      <span style="color: black;">protected</span> <span style="color: black;">static</span> $foo;

      <span style="color: black;">abstract</span> <span style="color: black;">protected</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">zim</span><span style="color: black;">()</span></span>;

      <span style="color: black;">final</span> <span style="color: black;">public</span> <span style="color: black;">static</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">bar</span><span style="color: black;">()</span>
      </span>{
      <span style="color: black;">// method body</span>
      }
      }
      <span style="color: black;">4.6</span>. <span style="color: black;">办法</span>及函数调用
    </span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">办法</span>及函数调用时,<span style="color: black;">办法</span>名或函数名与参数左括号之间<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有空格,参数右括号前<span style="color: black;">亦</span> <strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有空格。<span style="color: black;">每一个</span>逗号前<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有空格,但其后<strong style="color: blue;">必须</strong>有一个空格。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      bar();
      $foo-&gt;bar($arg1);
      Foo::bar($arg2, $arg3);
    </span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">参数<strong style="color: blue;"><span style="color: black;">能够</span></strong>分列成多行,此时<span style="color: black;">包含</span><span style="color: black;">第1</span>个参数在内的<span style="color: black;">每一个</span>参数都<strong style="color: blue;">必须</strong>单独成行。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>$foo-&gt;bar(
      $longArgument,
      $longerArgument,
      $muchLongerArgument
      );</span><span style="color: black;">掌控</span>结构<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">掌控</span>结构的基本规范如下:</p><span style="color: black;">掌控</span>结构关键词后<strong style="color: blue;">必须</strong>有一个空格。左括号 <span style="color: black;">(</span> 后<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有空格。右括号 <span style="color: black;">)</span> 前<span style="color: black;">亦</span><strong style="color: blue;"><span style="color: black;">必定</span>不</strong>能有空格。右括号 <span style="color: black;">)</span> 与<span style="color: black;">起始</span>花括号 <span style="color: black;">{</span> 间<strong style="color: blue;"><span style="color: black;">必定</span></strong>有一个空格。结构体主体<strong style="color: blue;">一定</strong>要有一次缩进。结束花括号 <span style="color: black;">}</span> <strong style="color: blue;"><span style="color: black;">必定</span></strong>在结构体主体后单独成行。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">每一个</span>结构体的主体都<strong style="color: blue;">必须</strong>被<span style="color: black;">包括</span>在成对的花括号之中, 这能让结构体更加结构话,以及减少加入新行时,出错的可能性。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">5.1. if 、 elseif 和 else</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">标准的 <span style="color: black;">if</span> 结构如下代码所示,留意 括号、空格以及花括号的位置, <span style="color: black;">重视</span> <span style="color: black;">else</span> 和 <span style="color: black;">elseif</span> 都与前面的结束花括号在同一行。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">if</span> ($expr1) {
      <span style="color: black;">// if body</span>
      } <span style="color: black;">elseif</span> ($expr2) {
      <span style="color: black;">// elseif body</span>
      } <span style="color: black;">else</span> {
      <span style="color: black;">// else body;</span>
      }
    </span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">应该</strong><span style="color: black;">运用</span>关键词 <span style="color: black;">elseif</span> 代替所有 <span style="color: black;">else if</span> ,以使得所有的<span style="color: black;">掌控</span>关键字都像是单独的一个词。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">5.2. switch 和 case</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">标准的 <span style="color: black;">switch</span> 结构如下代码所示,留意括号、空格以及花括号的位置。 <span style="color: black;">case</span> 语句<strong style="color: blue;">必须</strong>相对 <span style="color: black;">switch</span> 进行一次缩进,而 <span style="color: black;">break</span> 语句以及 <span style="color: black;">case</span> 内的其它语句都 必须 相对 <span style="color: black;">case</span> 进行一次缩进。 <span style="color: black;">倘若</span>存在非空的 <span style="color: black;">case</span> 直穿语句,主体里必须有类似 <span style="color: black;">// no break</span> 的注释。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">switch</span> ($expr) {
      <span style="color: black;">case</span> <span style="color: black;">0</span>:
      <span style="color: black;">echo</span> <span style="color: black;">First case, with a break</span>;
      <span style="color: black;">break</span>;
      <span style="color: black;">case</span> <span style="color: black;">1</span>:
      <span style="color: black;">echo</span> <span style="color: black;">Second case, which falls through</span>;
      <span style="color: black;">// no break</span>
      <span style="color: black;">case</span> <span style="color: black;">2</span>:
      <span style="color: black;">case</span> <span style="color: black;">3</span>:
      <span style="color: black;">case</span> <span style="color: black;">4</span>:
      <span style="color: black;">echo</span> <span style="color: black;">Third case, return instead of break</span>;
      <span style="color: black;">return</span>;
      <span style="color: black;">default</span>:
      <span style="color: black;">echo</span> <span style="color: black;">Default case</span>;
      <span style="color: black;">break</span>;
      }
    </span>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">5.3. while 和 do while</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">一个规范的 <span style="color: black;">while</span> 语句应该如下所示,<span style="color: black;">重视</span>其 括号、空格以及花括号的位置。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">while</span> ($expr) {
      <span style="color: black;">// structure body</span>
      }
    </span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">标准的 <span style="color: black;">do while</span> 语句如下所示,<span style="color: black;">一样</span>的,<span style="color: black;">重视</span>其 括号、空格以及花括号的位置。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">do</span> {
      <span style="color: black;">// structure body;</span>
      } <span style="color: black;">while</span> ($expr);
    </span>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">5.4. for</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">标准的 <span style="color: black;">for</span> 语句如下所示,<span style="color: black;">重视</span>其 括号、空格以及花括号的位置。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">for</span> ($i = <span style="color: black;">0</span>; $i &lt; <span style="color: black;">10</span>; $i++) {<span style="color: black;">// for body</span>
      }
    </span>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">5.5. foreach</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">标准的 <span style="color: black;">foreach</span> 语句如下所示,<span style="color: black;">重视</span>其 括号、空格以及花括号的位置。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">foreach</span> ($iterable <span style="color: black;">as</span> $key =&gt; $value) {
      <span style="color: black;">// foreach body</span>
      }
    </span>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">5.6. try, catch</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">标准的 <span style="color: black;">try catch</span> 语句如下所示,<span style="color: black;">重视</span>其 括号、空格以及花括号的位置。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">try</span> {
      <span style="color: black;">// try body</span>
      } <span style="color: black;">catch</span> (FirstExceptionType $e) {
      <span style="color: black;">// catch body</span>
      } <span style="color: black;">catch</span> (OtherExceptionType $e) {
      <span style="color: black;">// catch body</span>
      }
    </span>闭包<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">闭包声明时,关键词 <span style="color: black;">function</span> 后以及关键词 <span style="color: black;">use</span> 的前后都<strong style="color: blue;">必须</strong>要有一个空格。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">起始</span>花括号<strong style="color: blue;">必须</strong>写在声明的同一行,结束花括号<strong style="color: blue;">必须</strong>紧跟主体结束的下一行。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">参数列表和变量列表的左括号后以及右括号前,<strong style="color: blue;">必须<span style="color: black;">不可</span></strong>有空格。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">参数和变量列表中,逗号前<strong style="color: blue;">必须<span style="color: black;">不可</span></strong>有空格,而逗号后<strong style="color: blue;">必须</strong>要有空格。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">闭包中有默认值的参数<strong style="color: blue;">必须</strong>放到列表的后面。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">标准的闭包声明语句如下所示,<span style="color: black;">重视</span>其 括号、逗号、空格以及花括号的位置。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      $closureWithArgs = <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">($arg1, $arg2)</span> </span>{
      <span style="color: black;">// body</span>
      };

      $closureWithArgsAndVars = <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">($arg1, $arg2)</span> <span style="color: black;">use</span> <span style="color: black;">($var1, $var2)</span> </span>{
      <span style="color: black;">// body</span>
      };
    </span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">参数列表以及变量列表<strong style="color: blue;"><span style="color: black;">能够</span></strong>分成多行,<span style="color: black;">这般</span>,<span style="color: black;">包含</span><span style="color: black;">第1</span>个在内的<span style="color: black;">每一个</span>参数或变量都<strong style="color: blue;">必须</strong>单独成行,而列表的右括号与闭包的<span style="color: black;">起始</span>花括号<strong style="color: blue;">必须</strong>放在同一行。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">以下几个例子,<span style="color: black;">包括</span>了参数和变量列表被分成多行的多<span style="color: black;">状况</span>。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      $longArgs_noVars = <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">(
                $longArgument,
                $longerArgument,
                $muchLongerArgument
                )</span> </span>{
      <span style="color: black;">// body</span>
      };

      $noArgs_longVars = <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">()</span> <span style="color: black;">use</span> <span style="color: black;">(
                $longVar1,
                $longerVar2,
                $muchLongerVar3
                )</span> </span>{
      <span style="color: black;">// body</span>};

      $longArgs_longVars =<span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">(
                $longArgument,
                $longerArgument,
                $muchLongerArgument
                )</span> <span style="color: black;">use</span> <span style="color: black;">(
                $longVar1,
                $longerVar2,
                $muchLongerVar3
                )</span> </span>{
      <span style="color: black;">// body</span>
      };

      $longArgs_shortVars = <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">(
                $longArgument,
                $longerArgument,
                $muchLongerArgument
                )</span> <span style="color: black;">use</span> <span style="color: black;">($var1)</span> </span>{
      <span style="color: black;">// body</span>};

      $shortArgs_longVars =<span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">($arg)</span> <span style="color: black;">use</span> <span style="color: black;">(
                $longVar1,
                $longerVar2,
                $muchLongerVar3
                )</span> </span>{
      <span style="color: black;">// body</span>
      };
    </span>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">重视</span>,闭包被直接用作函数或<span style="color: black;">办法</span>调用的参数时,以上规则仍然适用。</p><span style="color: black;"><span style="color: black;">&lt;?php</span>
      $foo-&gt;bar(
      $arg1,
      <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">($arg2)</span> <span style="color: black;">use</span> <span style="color: black;">($var1)</span> </span>{
      <span style="color: black;">// body</span>
      },
      $arg3
      );
    </span>总结<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">以上规范难免有疏忽,其中<span style="color: black;">包含</span>但不仅限于:</p>全局变量和常量的定义函数的定义操作符和赋值行内对齐注释和文档描述块类名的前缀及后缀最佳实践<h1 style="color: black; text-align: left; margin-bottom: 10px;">日志接口规范</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">本文制定了日志类库的通用接口规范。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">本规范的<span style="color: black;">重点</span>目的,是为了让日志类库以简单通用的方式,<span style="color: black;">经过</span>接收一个 <span style="color: black;">Psr\Log\LoggerInterface</span> 对象,来记录日志信息。 框架以及CMS内容管理系统如有需要,<strong style="color: blue;"><span style="color: black;">能够</span></strong>对此接口进行扩展,但需遵循本规范, 这<span style="color: black;">才可</span><span style="color: black;">保准</span>在<span style="color: black;">运用</span>第三方的类库文件时,日志接口仍能正常对接。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">本文中的 <span style="color: black;">实现者</span> 指的是实现了 <span style="color: black;">LoggerInterface</span> 接口的类库<span style="color: black;">或</span>框架,反过来讲,<span style="color: black;">她们</span><span style="color: black;">便是</span> <span style="color: black;">LoggerInterface</span> 的 <span style="color: black;"><span style="color: black;">运用</span>者</span>。</p>规范说明<h1 style="color: black; text-align: left; margin-bottom: 10px;">1.1 基本规范</h1><span style="color: black;">LoggerInterface</span>接口对外定义了八个<span style="color: black;">办法</span>,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency 。第九个<span style="color: black;">办法</span> ——<span style="color: black;">log</span>,其<span style="color: black;">第1</span>个参数为记录的等级。可<span style="color: black;">运用</span>一个预先定义的等级常量<span style="color: black;">做为</span>参数来调用此<span style="color: black;">办法</span>,<strong style="color: blue;">必须</strong>与直接调用以上八个<span style="color: black;">办法</span><span style="color: black;">拥有</span>相同的效果。<span style="color: black;">倘若</span>传入的等级常量参数<span style="color: black;">无</span>预先定义,则<strong style="color: blue;">必须</strong>抛出 <span style="color: black;">Psr\Log\InvalidArgumentException</span> 类型的<span style="color: black;">反常</span>。在不确定的<span style="color: black;">状况</span>下,<span style="color: black;">运用</span>者<strong style="color: blue;"><span style="color: black;">不应</span></strong><span style="color: black;">运用</span>未支持的等级常量来调用此<span style="color: black;">办法</span>。<h1 style="color: black; text-align: left; margin-bottom: 10px;">1.2 记录信息</h1>以上<span style="color: black;">每一个</span><span style="color: black;">办法</span>都接受一个字符串类型<span style="color: black;">或</span>是有 <span style="color: black;">__toString()</span><span style="color: black;">办法</span>的对象<span style="color: black;">做为</span>记录信息参数,<span style="color: black;">这般</span>,实现者就能把它当成字符串来处理,否则实现者<strong style="color: blue;">必须</strong>自己把它转换成字符串。记录信息参数<strong style="color: blue;"><span style="color: black;">能够</span></strong>携带占位符,实现者<strong style="color: blue;"><span style="color: black;">能够</span></strong><span style="color: black;">按照</span>上下文将其它替换成相应的值。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">其中占位符<strong style="color: blue;">必须</strong>与上下文数组中的键名保持一致。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">占位符的名<span style="color: black;">叫作</span><strong style="color: blue;">必须</strong>由一个左花括号 <span style="color: black;">{</span> 以及一个右括号 <span style="color: black;">}</span> <span style="color: black;">包括</span>。但花括号与名<span style="color: black;">叫作</span>之间<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>有空格符。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">占位符的名<span style="color: black;">叫作</span><strong style="color: blue;">应该</strong>只由 <span style="color: black;">A-Z</span>、 <span style="color: black;">a-z</span>,<span style="color: black;">0-9</span>、下划线 <span style="color: black;">_</span>、以及英文的句号 <span style="color: black;">.</span><span style="color: black;">构成</span>,其它字符<span style="color: black;">做为</span>将来占位符规范的<span style="color: black;">保存</span>。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">实现者<strong style="color: blue;"><span style="color: black;">能够</span></strong><span style="color: black;">经过</span>对占位符采用<span style="color: black;">区别</span>的转义和转换策略,来生成<span style="color: black;">最后</span>的日志。 而<span style="color: black;">运用</span>者在不<span style="color: black;">晓得</span>上下文的前提下,<strong style="color: blue;"><span style="color: black;">不应</span></strong>提前转义占位符。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">以下是一个占位符<span style="color: black;">运用</span>的例子:</p><span style="color: black;">/**
      * 用上下文信息替换记录信息中的占位符
      */</span>
    <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">interpolate</span><span style="color: black;">($message, array $context = array<span style="color: black;">()</span>)</span>
    </span>{
    <span style="color: black;">// 构建一个花括号<span style="color: black;">包括</span>的键名的替换数组</span>
    $replace = <span style="color: black;">array</span>();
    <span style="color: black;">foreach</span> ($context <span style="color: black;">as</span>$key =&gt; $val) {
    $replace[<span style="color: black;">{</span> . $key . <span style="color: black;">}</span>] = $val;
    }

    <span style="color: black;">// 替换记录信息中的占位符,最后返回修改后的记录信息。</span>
    <span style="color: black;">return</span> strtr($message, $replace);
    }

    <span style="color: black;">// 含有带花括号占位符的记录信息。</span>
    $message = <span style="color: black;">"User {username} created"</span>;

    <span style="color: black;">// 带有替换信息的上下文数组,键名为占位符名<span style="color: black;">叫作</span>,键值为替换值。</span>
    $context = <span style="color: black;">array</span>(<span style="color: black;">username</span> =&gt; <span style="color: black;">bolivar</span>);

    <span style="color: black;">// 输出 "Username bolivar created"</span>
    <span style="color: black;">echo</span> interpolate($message, $context);
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">1.3 上下文</h1><span style="color: black;">每一个</span>记录函数都接受一个上下文数组参数,用来装载字符串类型<span style="color: black;">没法</span><span style="color: black;">暗示</span>的信息。它<strong style="color: blue;"><span style="color: black;">能够</span></strong>装载任何信息,<span style="color: black;">因此</span>实现者<strong style="color: blue;">必须</strong><span style="color: black;">保证</span>能正确处理其装载的信息,<span style="color: black;">针对</span>其装载的数据,<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong> 抛出<span style="color: black;">反常</span>,或产生PHP出错、警告或提醒信息(error、warning、notice)。如需<span style="color: black;">经过</span>上下文参数传入了一个 <span style="color: black;">Exception</span> 对象, <strong style="color: blue;">必须</strong>以<span style="color: black;">exception</span> <span style="color: black;">做为</span>键名。 记录<span style="color: black;">反常</span>信息是很<span style="color: black;">广泛</span>的,<span style="color: black;">因此</span><span style="color: black;">倘若</span>它能够在记录类库的底层实现,就能够让实现者从<span style="color: black;">反常</span>信息中抽丝剥茧。 当然,实现者在<span style="color: black;">运用</span>它时,<strong style="color: blue;">必须</strong><span style="color: black;">保证</span>键名为 <span style="color: black;">exception</span> 的键值<span style="color: black;">是不是</span>真的是一个 <span style="color: black;">Exception</span>,毕竟它<strong style="color: blue;"><span style="color: black;">能够</span></strong>装载任何信息。<h1 style="color: black; text-align: left; margin-bottom: 10px;">1.4 助手类和接口</h1><span style="color: black;">Psr\Log\AbstractLogger</span> 类使得只需继承它和实现其中的 <span style="color: black;">log</span> <span style="color: black;">办法</span>,就能够很轻易地实现 <span style="color: black;">LoggerInterface</span> 接口,而<span style="color: black;">另一</span>八个<span style="color: black;">办法</span>就能够把记录信息和上下文信息传给它。<span style="color: black;">一样</span>地,<span style="color: black;">运用</span> <span style="color: black;">Psr\Log\LoggerTrait</span> <span style="color: black;">亦</span>只需实现其中的 <span style="color: black;">log</span><span style="color: black;">办法</span>。<span style="color: black;">不外</span>,需要<span style="color: black;">尤其</span><span style="color: black;">重视</span>的是,在traits可复用代码块还<span style="color: black;">不可</span>实现接口前,还需要<span style="color: black;">implement LoggerInterface</span>。在<span style="color: black;">无</span>可用的日志记录器时, <span style="color: black;">Psr\Log\NullLogger</span> 接口<strong style="color: blue;"><span style="color: black;">能够</span></strong>为<span style="color: black;">运用</span>者<span style="color: black;">供给</span>一个备用的日志“黑洞”。<span style="color: black;">不外</span>,当上下文的构建非常消耗资源时,带<span style="color: black;">要求</span><span style="color: black;">检测</span>的日志记录或许是更好的办法。<span style="color: black;">Psr\Log\LoggerAwareInterface</span>接口仅<span style="color: black;">包含</span>一个<span style="color: black;">setLogger(LoggerInterface $logger)</span> <span style="color: black;">办法</span>,框架<span style="color: black;">能够</span><span style="color: black;">运用</span>它实现自动连接任意的日志记录实例。<span style="color: black;">Psr\Log\LoggerAwareTrait</span> trait可复用代码块<span style="color: black;">能够</span>在任何的类里面<span style="color: black;">运用</span>,只需<span style="color: black;">经过</span>它<span style="color: black;">供给</span>的 <span style="color: black;">$this-&gt;logger</span>,就<span style="color: black;">能够</span><span style="color: black;">容易</span>地实现等同的接口。<span style="color: black;">Psr\Log\LogLevel</span> 类装载了八个记录等级常量。包<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">以上</span>的接口、类和<span style="color: black;">关联</span>的<span style="color: black;">反常</span>类,以及一系列的实现检测文件,都<span style="color: black;">包括</span>在 psr/log 文件包中。</p><span style="color: black;">Psr\Log\LoggerInterface</span><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">namespace</span> <span style="color: black;">Psr</span>\<span style="color: black;">Log</span>;

      <span style="color: black;">/**
            * 日志记录实例
            *
            * 日志信息变量 —— message, **必须**是一个字符串或是实现了 __toString() <span style="color: black;">办法</span>的对象。
            *
            * 日志信息变量中**<span style="color: black;">能够</span>**<span style="color: black;">包括</span>格式如 “{foo}” (<span style="color: black;">表率</span>foo) 的占位符,
            * 它将会由上下文数组中键名为 "foo" 的键值替代。
            *
            * 上下文数组<span style="color: black;">能够</span>携带任意的数据,<span style="color: black;">独一</span>的限制是,当它携带的是一个 exception 对象时,它的键名 必须 是 "exception"。
            *
            * 详情可参阅: https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-3-logger-interface-cn.md
            */</span>
      <span style="color: black;"><span style="color: black;">interface</span> <span style="color: black;">LoggerInterface</span>
      </span>{
      <span style="color: black;">/**
            * 系统不可用
            *
            *<span style="color: black;">@param</span> string $message
            * <span style="color: black;">@param</span> array $context
            * <span style="color: black;">@return</span> null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">emergency</span><span style="color: black;">($message, array $context = array<span style="color: black;">()</span>)</span></span>;

      <span style="color: black;">/**
            * **必须**立刻采取行动
            *
            * 例如:在<span style="color: black;">全部</span>网站都垮掉了、数据库不可用了<span style="color: black;">或</span>其他的<span style="color: black;">状况</span>下,**应该**发送一条警报短信把你叫醒。
            *
            *<span style="color: black;">@param</span> string $message
            * <span style="color: black;">@param</span> array $context
            * <span style="color: black;">@return</span> null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">alert</span><span style="color: black;">($message, array $context = array<span style="color: black;">()</span>)</span></span>;

      <span style="color: black;">/**
            * 紧急<span style="color: black;">状况</span>
            *
            * 例如:程序组件不可用<span style="color: black;">或</span><span style="color: black;">显现</span>非预期的<span style="color: black;">反常</span>。
            *
            * <span style="color: black;">@param</span>string $message
            *<span style="color: black;">@param</span> array $context
            * <span style="color: black;">@return</span> null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">critical</span><span style="color: black;">($message, array $context = array<span style="color: black;">()</span>)</span></span>;

      <span style="color: black;">/**
            * 运行时<span style="color: black;">显现</span>的错误,不需要立刻采取行动,但必须记录下来以备检测。
            *
            *<span style="color: black;">@param</span> string $message
            * <span style="color: black;">@param</span> array $context
            * <span style="color: black;">@return</span>null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">error</span><span style="color: black;">($message, array $context = array<span style="color: black;">()</span>)</span></span>;

      <span style="color: black;">/**
            * <span style="color: black;">显现</span>非错误性的<span style="color: black;">反常</span>。
            *
            * 例如:<span style="color: black;">运用</span>了被弃用的API、错误地<span style="color: black;">运用</span>了API<span style="color: black;">或</span>非预想的不必要错误。
            *
            *<span style="color: black;">@param</span> string $message
            * <span style="color: black;">@param</span> array $context
            * <span style="color: black;">@return</span> null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">warning</span><span style="color: black;">($message, array $context = array<span style="color: black;">()</span>)</span></span>;

      <span style="color: black;">/**
            * <span style="color: black;">通常</span>性重要的事件。
            *
            * <span style="color: black;">@param</span> string $message
            * <span style="color: black;">@param</span>array $context
            *<span style="color: black;">@return</span> null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">notice</span><span style="color: black;">($message, array $context = array<span style="color: black;">()</span>)</span></span>;

      <span style="color: black;">/**
            * 重要事件
            *
            * 例如:用户登录和SQL记录。
            *
            *<span style="color: black;">@param</span> string $message
            * <span style="color: black;">@param</span> array $context
            * <span style="color: black;">@return</span> null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">info</span><span style="color: black;">($message, array $context = array<span style="color: black;">()</span>)</span></span>;

      <span style="color: black;">/**
            * debug 详情
            *
            * <span style="color: black;">@param</span> string $message
            * <span style="color: black;">@param</span>array $context
            *<span style="color: black;">@return</span> null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">debug</span><span style="color: black;">($message, array $context = array<span style="color: black;">()</span>)</span></span>;

      <span style="color: black;">/**
            * 任意等级的日志记录
            *
            * <span style="color: black;">@param</span>mixed $level
            *<span style="color: black;">@param</span> string $message
            * <span style="color: black;">@param</span> array $context
            * <span style="color: black;">@return</span> null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">log</span><span style="color: black;">($level, $message, array $context = array<span style="color: black;">()</span>)</span></span>;
      }
    </span><span style="color: black;">Psr\Log\LoggerAwareInterface</span><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">namespace</span> <span style="color: black;">Psr</span>\<span style="color: black;">Log</span>;

      <span style="color: black;">/**
            * logger-aware 定义实例
            */</span>
      <span style="color: black;"><span style="color: black;">interface</span> <span style="color: black;">LoggerAwareInterface</span>
      </span>{
      <span style="color: black;">/**
            * 设置一个日志记录实例
            *
            * <span style="color: black;">@param</span> LoggerInterface $logger
            * <span style="color: black;">@return</span> null
            */</span>
      <span style="color: black;">public</span> <span style="color: black;"><span style="color: black;">function</span> <span style="color: black;">setLogger</span><span style="color: black;">(LoggerInterface $logger)</span></span>;
      }
    </span><span style="color: black;">Psr\Log\LogLevel</span><span style="color: black;"><span style="color: black;">&lt;?php</span>
      <span style="color: black;">namespace</span> <span style="color: black;">Psr</span>\<span style="color: black;">Log</span>;

      <span style="color: black;">/**
            * 日志等级常量定义
            */</span>
      <span style="color: black;"><span style="color: black;">class</span> <span style="color: black;">LogLevel</span>
      </span>{
      <span style="color: black;">const</span> EMERGENCY = <span style="color: black;">emergency</span>;
      <span style="color: black;">const</span> ALERT = <span style="color: black;">alert</span>;
      <span style="color: black;">const</span> CRITICAL = <span style="color: black;">critical</span>;
      <span style="color: black;">const</span> ERROR = <span style="color: black;">error</span>;
      <span style="color: black;">const</span> WARNING = <span style="color: black;">warning</span>;
      <span style="color: black;">const</span> NOTICE = <span style="color: black;">notice</span>;
      <span style="color: black;">const</span> INFO = <span style="color: black;">info</span>;
      <span style="color: black;">const</span>DEBUG =<span style="color: black;">debug</span>;
      }
    </span>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">Autoloader</h1>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">1. 概述</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">本 PSR 是关于由文件路径 自动载入 对应类的<span style="color: black;">关联</span>规范, 本规范是可互操作的,<span style="color: black;">能够</span><span style="color: black;">做为</span>任一自动载入规范的<span style="color: black;">弥补</span>,其中<span style="color: black;">包含</span> PSR-0,<span style="color: black;">另外</span>, 本 PSR 还<span style="color: black;">包含</span>自动载入的类对应的文件存放路径规范。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">2. <span style="color: black;">仔细</span>说明</h1>此处的“类”泛指所有的class类、接口、traits可复用代码块以及其它类似结构。一个完整的类名需<span style="color: black;">拥有</span>以下结构: \<span style="color: black;">&lt;<span style="color: black;">命名空间</span>&gt;</span>(\<span style="color: black;">&lt;<span style="color: black;">子命名空间</span>&gt;</span>)*\<span style="color: black;">&lt;<span style="color: black;">类名</span>&gt;</span>
    完整的类名<strong style="color: blue;">必须</strong>要有一个顶级命名空间,被<span style="color: black;">叫作</span>为 "vendor namespace";完整的类名<strong style="color: blue;"><span style="color: black;">能够</span></strong>有一个或多个子命名空间;完整的类名<strong style="color: blue;">必须</strong>有一个<span style="color: black;">最后</span>的类名;完整的类名中任意一部分中的下划线都是<span style="color: black;">无</span>特殊含义的;完整的类名<strong style="color: blue;"><span style="color: black;">能够</span></strong>由任意<span style="color: black;">体积</span>写字母<span style="color: black;">构成</span>;所有类名都<strong style="color: blue;">必须</strong>是<span style="color: black;">体积</span>写<span style="color: black;">敏锐</span>的。当<span style="color: black;">按照</span>完整的类名载入相应的文件……完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,<span style="color: black;">做为</span>“命名空间前缀”,其必须与<span style="color: black;">最少</span>一个“文件基目录”相对应;紧接命名空间前缀后的子命名空间<strong style="color: blue;">必须</strong>与相应的”文件基目录“相匹配,其中的命名空间分隔符将<span style="color: black;">做为</span>目录分隔符。末尾的类名<strong style="color: blue;">必须</strong>与对应的以 <span style="color: black;">.php</span> 为后缀的文件同名。自动加载器(autoloader)的实现<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>抛出<span style="color: black;">反常</span>、<strong style="color: blue;"><span style="color: black;">必定</span><span style="color: black;">不可</span></strong>触发任一级别的错误信息以及<strong style="color: blue;"><span style="color: black;">不该</span>该</strong>有返回值。<h1 style="color: black; text-align: left; margin-bottom: 10px;">3. 例子</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">下表展示了符合规范完整类名、命名空间前缀和文件基目录所对应的文件路径。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">没法</span>复制加载中的内容</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">关于本规范的实现,可参阅 <span style="color: black;">关联</span>实例</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">重视</span>:实例并<strong style="color: blue;">不</strong>属于规范的一部分,且随时<strong style="color: blue;">会</strong>有所变动。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">参考:</p>https://github.com/PizzaLiu/PHP-FIG

    <h1 style="color: black; text-align: left; margin-bottom: 10px;">4. 代码规范工具</h1>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">PHP Mess Detector(http://phpmd.org/)</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">PHP项目体检工具,<span style="color: black;">按照</span>你设定的标准(如单一文件代码体积,未<span style="color: black;">运用</span>的参数个数,未<span style="color: black;">运用</span>的<span style="color: black;">办法</span>数)<span style="color: black;">检测</span>PHP代码,超出设定的标准时报警。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">PHP Copy Paste Detector(https://github.com/sebastianbergmann/...)</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">顾名思义,<span style="color: black;">检测</span>冗余代码的</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">PHP Dead Code Detector(https://github.com/sebastianbergmann/...)</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">看名字就<span style="color: black;">晓得</span>了,<span style="color: black;">检测</span>从未被调用过的<span style="color: black;">办法</span></p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">PHP Code Sniffer(http://pear.php.net/package/PHP_CodeS...)</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">老牌代码格式化工具,PHP写的,Pear包,可自己hack,可集成到命令行里。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">你还<span style="color: black;">能够</span>用jenkins把<span style="color: black;">以上</span>工具以plugins形式整合起来,做<span style="color: black;">连续</span>集成:http://jenkins-php.org/</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">你还<span style="color: black;">能够</span>用xinc+phing跟<span style="color: black;">以上</span>工具集成起来做<span style="color: black;">连续</span>集成后的自动化打包发布:</p>http://code.google.com/p/xinc/




j8typz 发表于 2024-10-5 22:01:33

谷歌外链发布 http://www.fok120.com/

4lqedz 发表于 2024-10-18 19:37:27

我们有着相似的经历,你的感受我深有体会。

b1gc8v 发表于 2024-11-11 08:36:17

感谢你的精彩评论,为我的思绪打开了新的窗口。

nqkk58 发表于 2024-11-11 23:50:47

论坛外链网http://www.fok120.com/
页: [1]
查看完整版本: PHP代码规范