概论
1.主要依据的是①PSR-1、②PSR-12、③SonarQube的php规则部分、④PEAR规则、⑤Symfony编码规则,下面是链接(SonarQube好像只能在服务里面下插件看规则)
2.规范的意义?
①代码规范和设计规范还不是一件事情。设计规范讲的是如何拆分类,设计类,更好的做业务实现,更好的做扩展,更好的应对经常变化的需求。而代码规范是更细的讲如何写代码,如何定义类,如何写控制语句等等。
②遵守规范,可以增加代码可读性,也能让大家写的代码能够更加的整齐划一,旁人也能更好的支持或修改
③根据工作经验来看,减少一些应该怎么写的时间消耗。比如大括号到底是和类的关键词放一行,还是另起一行呢,心里有疑问,就会降低专注度。
注意事项
1.PSR是啥?
PHP Standards Recommendation,就是php-fig组织定的一套规范。
2.为啥要用PSR作为主要的参考依据和规范标准?
- 嗯...因为现在流行的新型框架的作者,都是参与者。php不像java那样,有那么多的大厂在使用,他们会自己定义规范,比如阿里的JAVA规范
- Symfony编码规则也是基于PSR。补充了一些自己的标准
- 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
};
网友评论