一、有意义的命名

1. 名副其实

  1. // 差劲:谁知道$arr是什么?$v是什么?
  2. foreach ($arr as $v) {
  3. // Do someting...
  4. }
  5. // 优秀:一眼就看出来这是一段循环处理订单列表的代码
  6. foreach ($orders as $order) {
  7. // Do someting
  8. }

2. 避免误导

  1. // 差劲:不会真有人变量用 $l、$O 吧?
  2. $l = 1;
  3. $O = 0;
  4. // 优秀:使用符合语境的变量
  5. $accounts = [];

3. 做有意义的区分

  1. // 差劲:3个变量都能表达用户信息,那到底区别是什么?
  2. $account = [];
  3. $accountInfo = [];
  4. $accountDetail = [];
  5. // 优秀:直接用$account
  6. $account = [];

4. 使用读的出来的名称

  1. // 举例:定义一个“消费者”变量
  2. // 差劲:用拼音、乱翻译、拼音英文混用、用其他国家的语言,用方言...
  3. $xiaofeizhe = [];
  4. $consuming = [];
  5. $consumer_liebiao = [];
  6. $o_kya_ku_sa_ma = [];
  7. $xiu_fai_zhe = [];
  8. // 优秀:使用符合语境的变量
  9. $consumers = [];
  10. $consumer_list = [];

5. 使用可搜索的名称

  1. // 差劲:用短单词、具体数值。谁知道7代表了啥?我要怎么做才能快速定位到这个代码并修改?
  2. if ($days > 7) {
  3. // Do someting...
  4. }
  5. // 优秀:使用常量、读取配置
  6. const MAX_DAYS_FOR_BOOKING = 7;
  7. if ($days > MAX_DAYS_FOR_BOOKING) {
  8. // Do someting...
  9. }

6. 类名和对象名应该是名词或名词短语

  1. // 差劲:使用其他类型修饰词
  2. $invoke = new Invoker();
  3. $invoke->invoke();
  4. // 优秀:使用符合语境的变量
  5. $invoker = new Invoker();
  6. $invoker->invoke();

7. 方法名应当是动词或动词短语

  1. // 差劲:使用其他类型修饰词
  2. class Printer {
  3. public function printers(): array {
  4. // Do someting
  5. }
  6. }
  7. // 优秀:使用符合语境的变量
  8. class Printer {
  9. public function getPrinters(): array {
  10. // Do someting
  11. }
  12. }

8. 不要添加没用的语境

  1. // 差劲:输入一个Alipay,IDE提示一堆的列表
  2. class AlipayAccountExrateAdviceAcceptRequest {}
  3. class AlipayAccountExrateAllclientrateQueryRequest {}
  4. class AlipayAccountExrateRatequeryRequest {}
  5. // 优秀:善用命名空间
  6. namespace Alipay\Account\Exrate;
  7. class AdviceAcceptRequest {}
  8. class AllclientrateQueryRequest {}
  9. class RatequeryRequest {}

二、函数

1. 越短小越好、只做一件事

  1. // 差劲:一个屏幕根本看不完
  2. function refundOrder($order) {
  3. // 此处省略一堆if else swtich混合的几百行、甚至上千行代码
  4. }
  5. // 优秀:函数式编程、面向对象编程
  6. class OrderService {
  7. protected $order;
  8. protected $operator;
  9. public function __construct(OrderRepository $order) {
  10. $this->order = $order;
  11. }
  12. public function setOperator(Operator $operator) {
  13. $this->operator = $operator;
  14. }
  15. }
  16. class RefundService extends OrderService {
  17. public function refund(): bool {
  18. // Do something
  19. }
  20. public function validate(): bool {
  21. // Do something
  22. }
  23. }

2. 使用描述性名称

  1. // 差劲:让人摸不着头脑的命名,不看函数体,我能否理解成,往数组$a里面追加$b
  2. function addNumber($a, $b) {
  3. return $a + $b;
  4. }
  5. // 优秀:使用符合语境的变量,函数动作就是要求和,名字直接就用求和的英文
  6. function sum($a, $b) {
  7. return $a + $b;
  8. }

3. 函数参数数量越少越好

  1. // 差劲:一个函数4个以上的参数
  2. function sendCoupon($account_id, $coupons, $link_type, $link_id) {
  3. // Do something
  4. }
  5. // 优秀:函数式编程、面向对象编程
  6. class SendCouponEvent {
  7. private $accounts;
  8. private $coupons;
  9. private $link_type;
  10. private $link_id;
  11. public function setAccounts(AccountRepository $accounts) {
  12. $this->accounts = $accounts;
  13. }
  14. public function setCoupons(CouponRepository $coupons) {
  15. $this->coupons = $coupons;
  16. }
  17. public function setLink(int $link_type, int $link_id) {
  18. $this->link_type = $link_type;
  19. $this->link_id = $link_id;
  20. }
  21. public function send() {
  22. // Do something
  23. }
  24. }
  25. $event = new SendCouponEvent();
  26. $event->setAccounts($accounts);
  27. $event->setCoupons($coupons);
  28. $event->setLink($link_type, $link_id);
  29. $event->send();

4. 分割指令与询问

  1. // 差劲:指令与询问合并
  2. if (setUser("user", $user)) {
  3. // Do something
  4. }
  5. // 优秀:指令与询问分割
  6. if (isEmpty($user)) {
  7. saveUser("user", $user);
  8. }

三、注释

1. 警示注释

  1. // 差劲:测试或危险操作代码不写注释
  2. function updateUsersScore() {
  3. Db::table("users")->where("id", ">", 0)->update(['score' => 0]);
  4. }
  5. // 优秀:告知其他人代码的目的
  6. function updateUsersScore() {
  7. // 一键清空用户积分,仅测试使用,请勿在生产环境运行
  8. Db::table("users")->where("id", ">", 0)->update(['score' => 0]);
  9. }

2. TODO

  1. // 差劲:乱写TODO、TODO内容为空、长期不处理...
  2. function testAddOrder() {
  3. // TODO
  4. }
  5. // 优秀:写真实会处理的TODO,如果长期未处理,直接删除!

3. 喃喃自语

  1. // 差劲:根本不知道注释想表达什么,目的是什么
  2. function testAddOrder() {
  3. try {
  4. } catch (Exception $e) {
  5. // 抛出异常了
  6. }
  7. }
  8. // 优秀:写清楚这个注释的目的是什么
  9. function testAddOrder() {
  10. try {
  11. } catch (Exception $e) {
  12. // 抛出异常了,记录异常日志
  13. Log::write($e->getTraceAsString());
  14. }
  15. }

4. 日志型注释

  1. // 差劲:记录修改日志
  2. function testAddOrder() {
  3. // 2021-01-01 生成商品
  4. // 2021-01-02 生成订单
  5. // 2021-01-03 订单退款
  6. }
  7. // 优秀:使用Git、SVN

5. 废话注释

  1. // 差劲:变量或者函数名一下就能看出来是什么,非要写个注释
  2. function testAddOrder() {
  3. $goods = [];//商品信息
  4. $order = [];//订单信息
  5. }
  6. // 优秀:变量或者函数命名已经符合语境,不要写多余解释

6. 位置标记

  1. // 差劲:使用长字符串分割代码
  2. class UserController {
  3. /************ 登录逻辑开始 *********/
  4. // 此处省略几百行代码
  5. /************ 登录逻辑结束 *********/
  6. /************ 注册逻辑开始 *********/
  7. // 此处省略几百行代码
  8. /************ 注册逻辑结束 *********/
  9. }
  10. // 优秀:删除无用注释、业务逻辑过于复杂可以拆分文件

7. 括号注释

  1. // 差劲:在每个括号类型后面写无意义注释,仅用于标记
  2. foreach ($users as $user) {
  3. if (isEmpty($user)) {
  4. // 此处省略几百行代码
  5. } //if
  6. // 此处省略几百行代码
  7. }//foreach
  8. // 优秀:函数式编程、面向对象编程

8. 注释掉的代码

  1. // 差劲:直接注释原有代码
  2. function addOrder() {
  3. $order = new OrderRepository();
  4. // 让人觉得这段代码可能是有用的,不能随意删除(实际已无用)
  5. // $order->setAmount($amount);
  6. $order->add();
  7. // 测试代码保留并提交,像个牛皮癣一样影响代码阅读与维护
  8. // halt($order);
  9. }
  10. // 优秀:无用代码直接删除!用Git管理历史记录!

9. 不明显的联系

  1. // 差劲:注释没有表达到位。为什么要加200?200是什么东西?
  2. function testSum($a) {
  3. // 此处需要加200
  4. return $a + 200;
  5. }
  6. // 优秀:使用有意义的命名

四、格式

编码风格指南:https://www.yuque.com/kubo/resources/frontend-style