美文网首页
PHP代码规范

PHP代码规范

作者: 木云先森 | 来源:发表于2020-04-23 19:12 被阅读0次

    概论

    1.主要依据的是①PSR-1、②PSR-12、③SonarQube的php规则部分、④PEAR规则、⑤Symfony编码规则,下面是链接(SonarQube好像只能在服务里面下插件看规则)

    PSR-1
    PSR-12
    PEAR规范
    Symfony规范

    2.规范的意义?

    ①代码规范和设计规范还不是一件事情。设计规范讲的是如何拆分类,设计类,更好的做业务实现,更好的做扩展,更好的应对经常变化的需求。而代码规范是更细的讲如何写代码,如何定义类,如何写控制语句等等。

    ②遵守规范,可以增加代码可读性,也能让大家写的代码能够更加的整齐划一,旁人也能更好的支持或修改

    ③根据工作经验来看,减少一些应该怎么写的时间消耗。比如大括号到底是和类的关键词放一行,还是另起一行呢,心里有疑问,就会降低专注度。

    注意事项

    1.PSR是啥?

    PHP Standards Recommendation,就是php-fig组织定的一套规范。

    2.为啥要用PSR作为主要的参考依据和规范标准?

    1. 嗯...因为现在流行的新型框架的作者,都是参与者。php不像java那样,有那么多的大厂在使用,他们会自己定义规范,比如阿里的JAVA规范
    2. Symfony编码规则也是基于PSR。补充了一些自己的标准
    3. PEAR的话,讲实话还是有点太过老旧,有些规范和PSR还有冲突。

    3.PSR就这2个规范吗?

    肯定不是,现在总共有20个规范(包括草案),其中3个放弃的,2个不推荐的,2个草案

    ①草案都是PHPDoc相关的,估计也是受到java的很大影响

    ②里面有相当一部分,是在讲HTTP消息的方式的,新型的php应用,比如PSR-11(容器接口),PSR-14(事件调度)。还有讲了缓存相关的

    ③其实相当一部分都是框架帮忙给封装好了,缓存的规则和算法很多,也不一定要PSR的规范就很合适

    ④所以我们主要看的还是代码规范的PSR-1,PSR-12,还有就是自动加载的PSR-4(也是框架已经应用,不过可以知道自己框架上加自己的组件)

    4.为啥代码规范会有2个定义,而不是一个定义标准就结束?

    因为php再进步,再不断的变化,所以写法和规则也要多一些扩展(前面的前置只是PHP新特性有说明)。所以PSR-1是基础编码规范,PSR-12是扩展编码规范。

    规范开始(激动人心的时刻)

    1.文件整体规范

    ①Files MUST use only <?php and <?= tags.(现在我们特别强调使用<?php的方式)

    ②Files Must use only UTF-8 without BOM for PHP code.

    ③文件结尾必须使用空换行符结尾

    ④?>结尾不需要

    2.书写相关

    ①代码必须使用4个空格缩进

    ②行的长度不应该超过80个字符

    ③关键字和类型必须小写(比如:if for class bool等等)

    ④类型关键字采用缩写形式(bool代替boolean,int代替integer)

    3.类相关(包含interface trait abstruct)

    ①类名的定义必须采用StudlyCaps方式(就是大驼峰)(每个单词的首字母都要大写)

    ②Method names MUST be declared in camelCase.(方法中采用小驼峰定义)

    <?php
    
    class Foo
    {
        public function getName()
        {
            //TODO
        }
    }
    

    ③类常量定义需要使用全部大写以及underscoreI(下划线)

    <?php
    
    namespace Vendor\Model;
    
    class Foo
    {
        const VERSION = '1.0';
        const DATE_APPROVED = '2012-06-01';
    }
    

    ④关于namespace use的写法

    tip: 1.namespace前后各有一行空行

    2.use每个类都要独占一行,而非在一行引入多个

    3.use引用类,函数,常量,彼此间要有空行

    <?php
    
    namespace Vendor\Package;
    
    use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
    use Vendor\Package\SomeNamespace\ClassD as D;
    
    use function Vendor\Package\{functionA, functionB, functionC};
    
    use const Vendor\Package\{ConstantA, ConstantB, ConstantC};
    
    class Foo extends Bar implements FooInterface
    {
        public function sampleFunction(int $a, int $b = null): array
        {
            if ($a === $b) {
                bar();
            } elseif ($a > $b) {
                $foo->bar($arg1);
            } else {
                BazClass::bar($arg2, $arg3);
            }
        }
    
        final public static function bar()
        {
            // method body
        }
    }
    
    

    class****关键字的左大括号****需要换行

    <?php
    
    namespace Vendor\Model;
    
    class Foo
    {
        //TODO
    }
    
    

    ⑤成员方法定义的左大括号需要换行

    <?php
    
    namespace Vendor\Model;
    
    class Foo
    {
        public function getName()
        {
            //TODO
        }
    }
    
    

    4.控制语句相关

    ①语句关键词后要有一个空行,参数间要有空行,左小括号后,右小括号前不需要空行。看实例!文字解释还是太苍白

    <?php
    
    if ($a === $b) {
        bar();
    } elseif ($a > $b) {
        $foo->bar($arg1);
    } else {
        BazClass::bar($arg2, $arg3);
    }
    
    for ($i = 0; $i < 10; $i++) {
        // for body
    }
    
    foreach ($iterable as $key => $value) {
        // foreach body
    }
    

    ②try catch相关,看实例,和上面的差不多(关注那些空格)(注意下面分支的catch前都有空格)

    <?php
    
    try {
        // try body
    } catch (FirstThrowableType $e) {
        // catch body
    } catch (OtherThrowableType | AnotherThrowableType $e) {
        // catch body
    } finally {
        // finally body
    }
    

    5.运算符相关

    ①一元运算符

    递增/递减运算符不得在运算符和操作数之间有任何空格:

    <?php
    
    $i++;
    ++$j;
    
    

    类型转换运算符的括号内不得有任何空格

    <?php
    
    $intValue = (int) $input;
    
    

    ②二元运算符

    所有的算术、比较、赋值、逻辑、字符串和类型元素符都必须位于前缀和之后至少一个空格

    <?php
    
    if ($a === $b) {
        $foo = $bar ?? $a ?? $b;
    } elseif ($a > $b) {
        $foo = $a + $b * $c;
    }
    

    ③三元运算符

    条件运算符(也简称为三元运算符)必须位于? 和:字符之前和之后至少一个空格:

    <?php
    
    $variable = $foo ? 'foo' : 'bar';
    
    

    6.闭包相关

    闭包必须在funciton后加一个空格,在关键字use之前和之后加一个空格。大家看实例

    <?php
    
    $closureWithArgs = function ($arg1, $arg2) {
        // body
    };
    $closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
        // body
    };
    $closureWithArgsVarsAndReturn = function ($arg1, $arg2) use ($var1, $var2): bool {
        // body
    };
    

    相关文章

      网友评论

          本文标题:PHP代码规范

          本文链接:https://www.haomeiwen.com/subject/tmqzihtx.html