Pembolehubah PHP


Pembolehubah

1. Gunakan nama berubah yang masuk akal

2 Entiti yang sama mesti menggunakan nama pembolehubah yang sama

3 Gunakan nama mesra carian (bahagian 1)

4 Gunakan nama mesra carian (bahagian 2)

5. Gunakan pembolehubah penjelasan sendiri

6 Elakkan bersarang dalam dan kembali seawal mungkin (bahagian 1)

7 Elakkan bersarang dalam dan kembali seawal mungkin (bahagian 2)

8 Gunakan nama pembolehubah yang kurang bermakna

9 Jangan tambah konteks yang tidak perlu

10 Gunakan nilai lalai parameter secara munasabah, tidak perlu melakukan pengesanan nilai lalai dalam kaedah

1. Gunakan nama berubah yang masuk akal

Teruk:

$ymdstr = $moment->format('y-m-d');

Baik:

$currentDate = $moment->format('y-m-d');

2. Entiti yang sama mesti menggunakan nama pembolehubah yang sama

Teruk:

getUserInfo();
getUserData();
getUserRecord();
getUserProfile();

Baik:

getUser();

3 Gunakan nama yang mesra carian (bahagian 1)

Kod ditulis untuk dibaca. Oleh itu, adalah penting untuk menulis kod yang sangat mudah dibaca dan dicari. Jika anda menamakan pembolehubah yang tidak bermakna dan mudah difahami, anda merugikan pembaca anda. Sila jadikan kod anda boleh dicari.

Teruk:

// 448 ™ 干啥的?
$result = $serializer->serialize($data, 448);

Baik:

$json = $serializer->serialize($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

4. Gunakan nama yang mesra carian (bahagian 2)

Teruk:

class User
{
    // 7 ™ 干啥的?
    public $access = 7;
}
 
// 4 ™ 干啥的?
if ($user->access & 4) {
    // ...
}
 
// 这里会发生什么?
$user->access ^= 2;

Baik:

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. Gunakan pembolehubah yang menerangkan sendiri

Teruk:

$address = 'One Infinite Loop, Cupertino 95014';
$cityZipCodeRegex = '/^[^,]+,\s*(.+?)\s*(\d{5})$/';
preg_match($cityZipCodeRegex, $address, $matches);
 
saveCityZipCode($matches[1], $matches[2]);

Tidak teruk:

Lebih baik, tetapi sangat bergantung pada kebiasaan dengan ungkapan biasa

$address = 'One Infinite Loop, Cupertino 95014';
$cityZipCodeRegex = '/^[^,]+,\s*(.+?)\s*(\d{5})$/';
preg_match($cityZipCodeRegex, $address, $matches);
 
[, $city, $zipCode] = $matches;
saveCityZipCode($city, $zipCode);

Baik:

Gunakan subperaturan dengan nama, anda tidak perlu memahami peraturan biasa untuk memahaminya

$address = 'One Infinite Loop, Cupertino 95014';
$cityZipCodeRegex = '/^[^,]+,\s*(?<city>.+?)\s*(?<zipCode>\d{5})$/';
preg_match($cityZipCodeRegex, $address, $matches);
 
saveCityZipCode($matches['city'], $matches['zipCode']);

6 Elakkan bersarang dalam dan kembali seawal mungkin (bahagian 1)

Terlalu banyak if else kenyataan biasanya menyukarkan kod anda untuk dibaca.

Aduh:

    if (empty($day)) {
        return false;
    }
 
    $openingDays = [
        'friday', 'saturday', 'sunday'
    ];
 
    return in_array(strtolower($day), $openingDays, true);
}

7 Elakkan bersarang dalam dan balik awal (bahagian 2)
Ops:
.

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';
    }
}

Baik:

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 Gunakan nama pembolehubah yang kurang bermakna

Jangan biarkan orang yang membaca kod anda meneka maksud pembolehubah yang anda tulis. Lebih baik menulis dengan jelas daripada samar-samar.

Teruk:

$l = ['Austin', 'New York', 'San Francisco'];
 
for ($i = 0; $i < count($l); $i++) {
    $li = $l[$i];
    doStuff();
    doSomeOtherStuff();
    // ...
    // ...
    // ...
  // 等等, `$li` 又代表什么?
    dispatch($li);
}

Baik:

$locations = ['Austin', 'New York', 'San Francisco'];
 
foreach ($locations as $location) {
    doStuff();
    doSomeOtherStuff();
    // ...
    // ...
    // ...
    dispatch($location);
}

9 Jangan tambah konteks yang tidak perlu

Jika beberapa maklumat sudah boleh dipelajari daripada nama kelas atau nama objek anda, jangan ulanginya dalam nama pembolehubah.

Teruk:

 class Car
{
    public $carMake;
    public $carModel;
    public $carColor;
 
    //...
}

Baik:

 class Car
{
    public $make;
    public $model;
    public $color;
 
    //...
}

10 Gunakan nilai lalai parameter secara munasabah, tidak perlu melakukan pengesanan nilai lalai dalam kaedah

Tidak bagus:

Tidak bagus, $breweryName 可能为 NULL.

 function createMicrobrewery($breweryName = 'Hipster Brew Co.'): void
{
    // ...
}

Okey:

Ia lebih mudah difahami daripada yang sebelumnya, tetapi lebih baik untuk dapat mengawal nilai pembolehubah.

 function createMicrobrewery($name = null): void
{
    $breweryName = $name ?: 'Hipster Brew Co.';
    // ...
}

Baik:

Jika program anda hanya menyokong PHP 7+, maka anda boleh menggunakan pembayang jenis untuk memastikan pembolehubah $breweryName 不是 NULL.

 function createMicrobrewery(string $breweryName = 'Hipster Brew Co.'): void
{
    // ...
}