--- title: PHP代码统一规范规则细节 date: 2023-06-09 tags: PHP --- # 规则Rule ## PHPDoc 1. 变量以及属性的辅助注解.方便IDE跳转和追踪 ```php <?php /** @var int $foo */ $foo = 2 + 2; final class Foo { /** * @var int */ public $bar; /** * @type float */ public $baz; } ``` 2. 变量以及属性多态类型优先级 ```php # 修正前: /** * @param null|string|int|\Foo $bar */ # 修正后: /** * @param \Foo|int|null|string $bar */ ``` 3. 注释对齐(居中非依左或不对齐) ```php /** # 修改前 * @param EngineInterface $templating * @param string $format * @param int $code an HTTP response status code * @param bool $debug * @param mixed &$reference a parameter passed by reference # 修改后 * @param EngineInterface $templating * @param string $format * @param int $code an HTTP response status code * @param bool $debug * @param mixed &$reference a parameter passed by reference ``` 4. 未确定类型使用`mixed`声明,默认值带为null需要用`?`修饰符 ```php /** * @param string|null $foo * @param int $bar * @param mixed $baz * * @return void */ function foo(?string = null $foo, int $bar, $baz) {} ``` 5. 数组key以及类属性对齐 ```php # 修改前 class Foo { public $a = 0; public $b = 0; public $c = 0; public$d = 0; } # 修改后 class Foo { public $a = 0; public $b = 0; public $c = 0; public $d = 0; } # 修改前 $arr = [ 'a'=>'tom', 'c' => 'sevne', 'd'=> 'mazda', 'b' =>'cross m78 unm', ] # 修改后 $arr = [ 'a' => 'tom', 'c' => 'sevne', 'd' => 'mazda', 'b' => 'cross m78 unm', ] ``` ## 代码约束 1. declare_strict 严格声明。主要解决程序在处理类型时候避免隐性转换 ```php declare(strict_types=1); //code .... ``` 2. 使用常量`PHP_EOL`替代 `"\n"` 换行符号 ```php echo "some thing \n"; echo "some thing PHP_EOL"; ``` 3. 声明函数必须使用`function_exists`包裹判断,避免函数重复声明 ```php if (!function_exists('dd')) { /** * dd 调试 * * @param ...$vars * * @return void */ function dd(...$vars) { foreach ($vars as $v) { VarDumper::dump($v); } exit(1); } } ``` 1. 函数或类的方法没有返回类型需要声明`void`类型 ```php function foo(string $a): void {} class Foo { public function handle(): void; { //code ... } } ``` 5. 命名空间导入,导入或完全限定全局类/函数/常量 ```php <?php # 修改前 $d = new \DateTimeImmutable(); # 修改后 $d = new DateTimeImmutable(); ``` 6. 使用`::class`替换完整类名使用,以及替代`get_class`函数 ```php # 修改前 $className = 'Foo\Bar\Baz'; # 修改后 $className = Baz::class; ``` 7. 多次调用转换成单次调用 ```php # 修改前 $a = isset($a) && isset($b); # 修改后 $a = isset($a, $b) ; # 修改前 unset($a); unset($b); # 修改后 unset($a, $b); ``` 8. 使用语法糖简化调用 ```php # 修改前 $boo = isset($foo) ? $foo : null; # 修改后 $boo = $foo ?? null; //或 $foo ??= null; # 修改前 $boo = $foo ? $foo : ''; # 修改后 $boo = $foo ?:''; # 修改前 list($a, $b) = $foos; # 修改后 [$a, $b] = $foos; ``` 9. 变量占位符由`${` 转换`{$)` php的高版本已经抛弃`${`用法 ```php $name = 'World'; # 修改前 echo "Hello ${name}!"; # 修改后 echo "Hello {$name}!"; ``` 10. PHP常量true、false和null须使用小写 ```php # 修改前 $a = FALSE; $b = True; $c = NULL; # 修改后 $a = false; $b = true; $c = null; ``` 11. 使用动态属性或方法,属性需要实现`__get`和`__set`,方法需要`_call()`或`__callStatic`以及在class 头部声明,便于ide识别以及查阅 ```php /** * Class Foo * * @property string $attr * @method Foo handleA(string $arg) */ class Foo { public function __set($name, $value) { //code } public function __get($name) { //code } public function __call($method, $args) { //code } public static function __callStatic($method, $args) { //code } } ``` ## 耦合优化 1. 使用依赖对象处理多参数方法或函数,避免后面迭代出现超级函数 ```php # 修改前 function foo(string $argv, int $argc, array $arg, \Closure $argz) :void { //code } # 修改后 Class Boo { public string $argv; public string $argc; public string $argg; public function argz() : Closure { return function (){ }; } } function foo(Boo $boo) :void { //code } ```