How to clean your PHP code
/ PHP变量
PHP变量
变量
1. 使用见字知意的变量名
坏:
$ymdstr = $moment->format('y-m-d');
好:
$currentDate = $moment->format('y-m-d');
2. 同一个实体要用相同的变量名
坏:
getUserInfo(); getUserData(); getUserRecord(); getUserProfile();
好:
getUser();
3. 使用便于搜索的名称 (part 1)
写代码是用来读的。所以写出可读性高、便于搜索的代码至关重要。 命名变量时如果没有有意义、不好理解,那就是在伤害读者。 请让你的代码便于搜索。
坏:
// 448 ™ 干啥的? $result = $serializer->serialize($data, 448);
好:
$json = $serializer->serialize($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
4. 使用便于搜索的名称 (part 2)
坏:
class User { // 7 ™ 干啥的? public $access = 7; } // 4 ™ 干啥的? if ($user->access & 4) { // ... } // 这里会发生什么? $user->access ^= 2;
好:
class User { const ACCESS_READ = 1; const ACCESS_CREATE = 2; const ACCESS_UPDATE = 4; const ACCESS_DELETE = 8; // 默认情况下用户 具有读、写和更新权限 public $access = self::ACCESS_READ | self::ACCESS_CREATE | self::ACCESS_UPDATE; } if ($user->access & User::ACCESS_UPDATE) { // do edit ... } // 禁用创建权限 $user->access ^= User::ACCESS_CREATE;
5. 使用自解释型变量
坏:
$address = 'One Infinite Loop, Cupertino 95014'; $cityZipCodeRegex = '/^[^,]+,\s*(.+?)\s*(\d{5})$/'; preg_match($cityZipCodeRegex, $address, $matches); saveCityZipCode($matches[1], $matches[2]);
不错:
好一些,但强依赖于正则表达式的熟悉程度
$address = 'One Infinite Loop, Cupertino 95014'; $cityZipCodeRegex = '/^[^,]+,\s*(.+?)\s*(\d{5})$/'; preg_match($cityZipCodeRegex, $address, $matches); [, $city, $zipCode] = $matches; saveCityZipCode($city, $zipCode);
好:
使用带名字的子规则,不用懂正则也能看的懂
$address = 'One Infinite Loop, Cupertino 95014'; $cityZipCodeRegex = '/^[^,]+,\s*(?<city>.+?)\s*(?<zipCode>\d{5})$/'; preg_match($cityZipCodeRegex, $address, $matches); saveCityZipCode($matches['city'], $matches['zipCode']);
6. 避免深层嵌套,尽早返回 (part 1)
太多的if else
语句通常会导致你的代码难以阅读,直白优于隐晦
糟糕:
if (empty($day)) { return false; } $openingDays = [ 'friday', 'saturday', 'sunday' ]; return in_array(strtolower($day), $openingDays, true); }
7. 避免深层嵌套,尽早返回 (part 2)
糟糕的:
function fibonacci(int $n) { if ($n < 50) { if ($n !== 0) { if ($n !== 1) { return fibonacci($n - 1) + fibonacci($n - 2); } else { return 1; } } else { return 0; } } else { return 'Not supported'; } }
好:
function fibonacci(int $n): int { if ($n === 0 || $n === 1) { return $n; } if ($n >= 50) { throw new \Exception('Not supported'); } return fibonacci($n - 1) + fibonacci($n - 2); }
8. 少用无意义的变量名
别让读你的代码的人猜你写的变量是什么意思。 写清楚好过模糊不清。
坏:
$l = ['Austin', 'New York', 'San Francisco']; for ($i = 0; $i < count($l); $i++) { $li = $l[$i]; doStuff(); doSomeOtherStuff(); // ... // ... // ... // 等等, `$li` 又代表什么? dispatch($li); }
好:
$locations = ['Austin', 'New York', 'San Francisco']; foreach ($locations as $location) { doStuff(); doSomeOtherStuff(); // ... // ... // ... dispatch($location); }
9. 不要添加不必要上下文
如果从你的类名、对象名已经可以得知一些信息,就别再在变量名里重复。
坏:
class Car { public $carMake; public $carModel; public $carColor; //... }
好:
class Car { public $make; public $model; public $color; //... }
10. 合理使用参数默认值,没必要在方法里再做默认值检测
不好:
不好,$breweryName
可能为 NULL.
function createMicrobrewery($breweryName = 'Hipster Brew Co.'): void { // ... }
还行:
比上一个好理解一些,但最好能控制变量的值
function createMicrobrewery($name = null): void { $breweryName = $name ?: 'Hipster Brew Co.'; // ... }
好:
如果你的程序只支持 PHP 7+, 那你可以用 type hinting 保证变量 $breweryName
不是 NULL.
function createMicrobrewery(string $breweryName = 'Hipster Brew Co.'): void { // ... }