Id tiếng vang php

PHP làm cho việc xây dựng một hệ thống dựa trên web trở nên tương đối dễ dàng, đó là lý do khiến nó trở nên phổ biến. Nhưng mặc dù dễ sử dụng, PHP đã phát triển thành một ngôn ngữ khá phức tạp, với nhiều sắc thái và sự tinh tế có thể khiến các nhà phát triển khó chịu, dẫn đến hàng giờ gỡ lỗi khó hiểu. Bài viết này nhấn mạnh mười lỗi phổ biến nhất mà các nhà phát triển PHP cần lưu ý.

Qua

Ilya Sanoyan

Ilya là nhà tư vấn CNTT, kiến ​​trúc web và quản lý với hơn 12 năm kinh nghiệm xây dựng và lãnh đạo các nhóm

SO SÁNH

SO SÁNH

PHP làm cho việc xây dựng một hệ thống dựa trên web trở nên tương đối dễ dàng, đó là lý do khiến nó trở nên phổ biến. Nhưng mặc dù dễ sử dụng, PHP đã phát triển thành một ngôn ngữ khá phức tạp với nhiều khuôn khổ, sắc thái và sự tinh tế có thể khiến các nhà phát triển khó chịu, dẫn đến hàng giờ gỡ lỗi khó hiểu. Bài viết này nhấn mạnh mười lỗi phổ biến nhất mà các nhà phát triển PHP cần lưu ý.

Sai lầm thường gặp #1. Để lại các tham chiếu mảng lơ lửng sau các vòng lặp
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5

Bạn không chắc cách sử dụng vòng lặp foreach trong PHP? . Ví dụ

$arr = array[1, 2, 3, 4];
foreach [$arr as &$value] {
    $value = $value * 2;
}
// $arr is now array[2, 4, 6, 8]

Vấn đề là, nếu bạn không cẩn thận, điều này cũng có thể gây ra một số tác dụng phụ và hậu quả không mong muốn. Cụ thể, trong ví dụ trên, sau khi mã được thực thi,

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
7 sẽ vẫn nằm trong phạm vi và sẽ giữ tham chiếu đến phần tử cuối cùng trong mảng. Do đó, các hoạt động tiếp theo liên quan đến
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
7 có thể vô tình sửa đổi phần tử cuối cùng trong mảng

Điều chính cần nhớ là

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5 không tạo phạm vi. Do đó,
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
7 trong ví dụ trên là một tham chiếu trong phạm vi trên cùng của tập lệnh. Trên mỗi lần lặp lại,
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5 đặt tham chiếu để trỏ đến phần tử tiếp theo của
if [$_POST['active']] {
    $postData = extractSomething[$_POST];
}

// ...

if [!isset[$postData]] {
    echo 'post not active';
}
2. Do đó, sau khi vòng lặp hoàn thành,
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
7 vẫn trỏ đến phần tử cuối cùng của
if [$_POST['active']] {
    $postData = extractSomething[$_POST];
}

// ...

if [!isset[$postData]] {
    echo 'post not active';
}
2 và vẫn nằm trong phạm vi

Đây là một ví dụ về các loại lỗi lảng tránh và khó hiểu mà điều này có thể dẫn đến.

________mười một

Đoạn mã trên sẽ xuất ra như sau

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
2

Không, đó không phải là một loại. Giá trị cuối cùng trên dòng cuối cùng thực sự là 2, không phải 3

tại sao?

Sau khi đi qua vòng lặp

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5 đầu tiên,
if [$_POST['active']] {
    $postData = extractSomething[$_POST];
}

// ...

if [!isset[$postData]] {
    echo 'post not active';
}
2 vẫn không thay đổi nhưng, như đã giải thích ở trên,
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
7 được để lại như một tham chiếu lơ lửng đến phần tử cuối cùng trong
if [$_POST['active']] {
    $postData = extractSomething[$_POST];
}

// ...

if [!isset[$postData]] {
    echo 'post not active';
}
2 [vì vòng lặp
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5 đó được truy cập
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
7 bằng tham chiếu]

Kết quả là, khi chúng ta đi qua vòng lặp

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5 thứ hai, "điều kỳ lạ" dường như xảy ra. Cụ thể, vì
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
7 hiện đang được truy cập theo giá trị [i. e. , bằng bản sao],
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5 sao chép từng phần tử
if [$_POST['active']] {
    $postData = extractSomething[$_POST];
}

// ...

if [!isset[$postData]] {
    echo 'post not active';
}
2 tuần tự vào
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
7 trong mỗi bước của vòng lặp. Kết quả là, đây là những gì xảy ra trong mỗi bước của vòng lặp
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5 thứ hai

  • Bước 1. Bản sao
    $arr = array[1, 2, 3, 4];
    foreach [$arr as &$value] {
        $value = $value * 2;
    }
    // $arr is now array[2, 4, 6, 8]
    
    57 [tôi. e. , “1”] thành
    $data = fetchRecordFromStorage[$storage, $identifier];
    if [!isset[$data['keyShouldBeSet']] {
        // do something here if 'keyShouldBeSet' is not set
    }
    
    7 [là tham chiếu đến
    $arr = array[1, 2, 3, 4];
    foreach [$arr as &$value] {
        $value = $value * 2;
    }
    // $arr is now array[2, 4, 6, 8]
    
    59], do đó, giờ đây
    $arr = array[1, 2, 3, 4];
    foreach [$arr as &$value] {
        $value = $value * 2;
    }
    // $arr is now array[2, 4, 6, 8]
    
    59 bằng 1. Vì vậy,
    if [$_POST['active']] {
        $postData = extractSomething[$_POST];
    }
    
    // ...
    
    if [!isset[$postData]] {
        echo 'post not active';
    }
    
    2 hiện chứa [1, 2, 1]
  • vượt qua 2. Bản sao
    $data = fetchRecordFromStorage[$storage, $identifier];
    if [!isset[$data['keyShouldBeSet']] {
        // do something here if 'keyShouldBeSet' is not set
    }
    
    02 [tôi. e. , “2”] thành
    $data = fetchRecordFromStorage[$storage, $identifier];
    if [!isset[$data['keyShouldBeSet']] {
        // do something here if 'keyShouldBeSet' is not set
    }
    
    7 [là tham chiếu đến
    $arr = array[1, 2, 3, 4];
    foreach [$arr as &$value] {
        $value = $value * 2;
    }
    // $arr is now array[2, 4, 6, 8]
    
    59], vì vậy, giờ đây
    $arr = array[1, 2, 3, 4];
    foreach [$arr as &$value] {
        $value = $value * 2;
    }
    // $arr is now array[2, 4, 6, 8]
    
    59 bằng 2. Vì vậy,
    if [$_POST['active']] {
        $postData = extractSomething[$_POST];
    }
    
    // ...
    
    if [!isset[$postData]] {
        echo 'post not active';
    }
    
    2 hiện chứa [1, 2, 2]
  • Bước 3. Sao chép
    $arr = array[1, 2, 3, 4];
    foreach [$arr as &$value] {
        $value = $value * 2;
    }
    // $arr is now array[2, 4, 6, 8]
    
    59 [hiện là “2”] thành
    $data = fetchRecordFromStorage[$storage, $identifier];
    if [!isset[$data['keyShouldBeSet']] {
        // do something here if 'keyShouldBeSet' is not set
    }
    
    7 [tham chiếu đến
    $arr = array[1, 2, 3, 4];
    foreach [$arr as &$value] {
        $value = $value * 2;
    }
    // $arr is now array[2, 4, 6, 8]
    
    59], do đó,
    $arr = array[1, 2, 3, 4];
    foreach [$arr as &$value] {
        $value = $value * 2;
    }
    // $arr is now array[2, 4, 6, 8]
    
    59 vẫn bằng 2. Vì vậy,
    if [$_POST['active']] {
        $postData = extractSomething[$_POST];
    }
    
    // ...
    
    if [!isset[$postData]] {
        echo 'post not active';
    }
    
    2 hiện chứa [1, 2, 2]

Để vẫn nhận được lợi ích của việc sử dụng các tham chiếu trong vòng lặp

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5 mà không gặp rủi ro về các loại sự cố này, hãy gọi
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
13 trên biến, ngay sau vòng lặp
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
5, để xóa tham chiếu; . g

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
3

Sai lầm thường gặp #2. Hiểu lầm hành vi
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
15

Mặc dù tên của nó, nhưng

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
15 không chỉ trả về false nếu một mục không tồn tại mà còn trả về
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
17 cho các giá trị
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
18

Hành vi này có nhiều vấn đề hơn so với lúc đầu và là nguyên nhân phổ biến của các vấn đề

Hãy xem xét những điều sau đây

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}

Tác giả của mã này có lẽ muốn kiểm tra xem

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
19 có được đặt trong
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
00 không. Tuy nhiên, như đã thảo luận,
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
01 cũng sẽ trả về false nếu
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
02 được đặt, nhưng được đặt thành
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
18. Vì vậy, logic trên là thiếu sót

Đây là một ví dụ khác

________số 8

Đoạn mã trên giả định rằng nếu

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
04 trả về
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
05, thì
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
06 nhất thiết phải được đặt và do đó,
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
07 sẽ trả về
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
05. Vì vậy, ngược lại, đoạn mã trên giả định rằng cách duy nhất mà
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
07 sẽ trả về
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
17 là nếu
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
04 cũng trả lại
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
17

Không

Như đã giải thích,

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
07 cũng sẽ trả về
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
17 nếu
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
105 được đặt thành
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
18. Do đó, có thể cho
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
07 trả lại
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
17 ngay cả khi
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
04 trả lại
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
05. Vì vậy, một lần nữa, logic trên là thiếu sót

Và nhân tiện, như một điểm phụ, nếu mục đích trong đoạn mã trên thực sự là kiểm tra lại xem

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
04 có trả về đúng hay không, thì dựa vào
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
15 vì đây là một quyết định viết mã kém trong mọi trường hợp. Thay vào đó, sẽ tốt hơn nếu chỉ kiểm tra lại
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
04; . e

$arr = array[1, 2, 3, 4];
foreach [$arr as &$value] {
    $value = $value * 2;
}
// $arr is now array[2, 4, 6, 8]
5

Tuy nhiên, đối với các trường hợp, điều quan trọng là phải kiểm tra xem một biến có thực sự được đặt hay không [i. e. , để phân biệt giữa biến chưa được đặt và biến được đặt thành

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
18], phương pháp
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
115 là một giải pháp hiệu quả hơn nhiều

Ví dụ: chúng ta có thể viết lại ví dụ đầu tiên trong hai ví dụ trên như sau

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
0

Hơn nữa, bằng cách kết hợp

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
115 với
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
117, chúng tôi có thể kiểm tra một cách đáng tin cậy liệu một biến trong phạm vi hiện tại đã được đặt hay chưa

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
1

Sai lầm thường gặp #3. Nhầm lẫn về việc trả lại theo tham chiếu so với tham chiếu. theo giá trị

Hãy xem xét đoạn mã này

________năm mươi

Nếu bạn chạy đoạn mã trên, bạn sẽ nhận được như sau

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
10

Chuyện gì vậy?

Vấn đề là đoạn mã trên nhầm lẫn việc trả về mảng theo tham chiếu với việc trả về mảng theo giá trị. Trừ khi bạn yêu cầu PHP trả về một mảng theo tham chiếu [i. e. , bằng cách sử dụng ________ 1118], theo mặc định, PHP sẽ trả về mảng “theo giá trị”. Điều này có nghĩa là một bản sao của mảng sẽ được trả về và do đó, hàm được gọi và người gọi sẽ không truy cập cùng một thể hiện của mảng

Vì vậy, lệnh gọi

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
119 ở trên trả về một bản sao của mảng
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
120 chứ không phải là một tham chiếu đến nó. Với ý nghĩ đó, chúng ta hãy xem lại hai dòng chính từ ví dụ trên

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
11

Một cách khắc phục có thể là lưu bản sao đầu tiên của mảng

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
120 được trả về bởi
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
119 và sau đó thao tác trên bản sao đó; . g

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
12

Mã đó sẽ hoạt động tốt [tôi. e. , nó sẽ xuất ra

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
123 mà không tạo bất kỳ thông báo "chỉ mục không xác định" nào], nhưng tùy thuộc vào những gì bạn đang cố gắng hoàn thành, cách tiếp cận này có thể phù hợp hoặc không. Cụ thể, đoạn mã trên sẽ không sửa đổi mảng
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
120 ban đầu. Vì vậy, nếu bạn muốn các sửa đổi của mình [chẳng hạn như thêm phần tử 'kiểm tra'] ảnh hưởng đến mảng ban đầu, thay vào đó, bạn cần sửa đổi hàm
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
119 để trả về một tham chiếu đến chính mảng
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
120. Điều này được thực hiện bằng cách thêm một
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
118 trước tên hàm, do đó chỉ ra rằng nó sẽ trả về một tham chiếu; . e

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
13

Đầu ra của điều này sẽ là

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
123, như mong đợi

Nhưng để làm cho mọi thứ trở nên khó hiểu hơn, thay vào đó hãy xem xét đoạn mã sau

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
14

Nếu bạn đoán rằng điều này sẽ dẫn đến lỗi “chỉ mục không xác định” giống như ví dụ về

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
129 trước đó của chúng tôi, thì bạn đã nhầm. Trên thực tế, mã này sẽ hoạt động tốt. Lý do là, không giống như mảng, PHP luôn chuyển các đối tượng theo tham chiếu. [
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
130 là một đối tượng SPL, bắt chước hoàn toàn cách sử dụng mảng, nhưng hoạt động như một đối tượng. ]

Như những ví dụ này chứng minh, không phải lúc nào PHP cũng hoàn toàn rõ ràng cho dù bạn đang xử lý một bản sao hay một tài liệu tham khảo. Do đó, điều cần thiết là phải hiểu những hành vi mặc định này [i. e. , biến và mảng được truyền theo giá trị;

Tất cả những gì đã nói, điều quan trọng cần lưu ý là việc trả về một tham chiếu đến một mảng hoặc một

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
130 nói chung là điều nên tránh, vì nó cung cấp cho người gọi khả năng sửa đổi dữ liệu riêng tư của cá thể. Điều này “bay vào mặt” của sự đóng gói. Thay vào đó, tốt hơn là sử dụng "getters" và "setters" kiểu cũ và. g

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
15

Cách tiếp cận này cung cấp cho người gọi khả năng đặt hoặc nhận bất kỳ giá trị nào trong mảng mà không cung cấp quyền truy cập công khai vào chính mảng

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
120 riêng tư

Sai lầm thường gặp #4. Thực hiện các truy vấn trong một vòng lặp

Không có gì lạ khi bắt gặp thứ gì đó như thế này nếu PHP của bạn không hoạt động

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
16

Mặc dù có thể hoàn toàn không có gì sai ở đây, nhưng nếu bạn làm theo logic trong mã, bạn có thể thấy rằng lệnh gọi có vẻ vô hại ở trên tới

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
133 cuối cùng dẫn đến một loại truy vấn nào đó, chẳng hạn như

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
17

Do đó, mỗi lần lặp lại của vòng lặp trên sẽ dẫn đến một truy vấn riêng tới cơ sở dữ liệu. Vì vậy, ví dụ: nếu bạn đã cung cấp một mảng gồm 1.000 giá trị cho vòng lặp, thì nó sẽ tạo ra 1.000 truy vấn riêng biệt cho tài nguyên. Nếu một tập lệnh như vậy được gọi trong nhiều luồng, thì nó có khả năng khiến hệ thống ngừng hoạt động

Do đó, điều quan trọng là phải nhận biết khi nào mã của bạn tạo truy vấn và bất cứ khi nào có thể, hãy thu thập các giá trị rồi chạy một truy vấn để tìm nạp tất cả kết quả

Một ví dụ về một nơi khá phổ biến để gặp truy vấn được thực hiện không hiệu quả [i. e. , trong một vòng lặp] là khi một biểu mẫu được đăng với một danh sách các giá trị [ví dụ: ID]. Sau đó, để truy xuất toàn bộ dữ liệu bản ghi cho từng ID, mã sẽ lặp qua mảng và thực hiện một truy vấn SQL riêng cho từng ID. Điều này thường sẽ trông giống như thế này

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
18

Nhưng điều tương tự có thể được thực hiện hiệu quả hơn nhiều trong một truy vấn SQL như sau

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
19

Do đó, điều quan trọng là phải nhận biết khi nào các truy vấn được thực hiện, trực tiếp hoặc gián tiếp, bởi mã của bạn. Bất cứ khi nào có thể, hãy thu thập các giá trị rồi chạy một truy vấn để tìm nạp tất cả các kết quả. Tuy nhiên, cũng cần phải thận trọng, điều này dẫn chúng ta đến lỗi PHP phổ biến tiếp theo…

Sai lầm thường gặp #5. Sử dụng bộ nhớ giả mạo và không hiệu quả

Mặc dù tìm nạp nhiều bản ghi cùng một lúc chắc chắn hiệu quả hơn chạy một truy vấn duy nhất cho mỗi hàng để tìm nạp, nhưng cách tiếp cận như vậy có khả năng dẫn đến tình trạng “hết bộ nhớ” trong

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
134 khi sử dụng tiện ích mở rộng
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
135 của PHP

Để chứng minh, chúng ta hãy xem hộp thử nghiệm với tài nguyên hạn chế [RAM 512MB], MySQL và

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
136

Chúng tôi sẽ khởi động một bảng cơ sở dữ liệu như thế này

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
20

OK, bây giờ hãy kiểm tra việc sử dụng tài nguyên

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
21

đầu ra

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
22

mát mẻ. Có vẻ như truy vấn được quản lý nội bộ an toàn về mặt tài nguyên

Tuy nhiên, để chắc chắn, hãy tăng giới hạn một lần nữa và đặt thành 100.000. uh-oh. Khi chúng tôi làm điều đó, chúng tôi nhận được

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
23

Chuyện gì đã xảy ra thế?

Vấn đề ở đây là cách thức hoạt động của mô-đun

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
135 của PHP. Nó thực sự chỉ là một proxy cho
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
134, làm công việc bẩn thỉu. Khi một phần dữ liệu được chọn, nó sẽ chuyển trực tiếp vào bộ nhớ. Vì bộ nhớ này không được quản lý bởi trình quản lý của PHP, nên
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
139 sẽ không hiển thị bất kỳ sự gia tăng nào trong việc sử dụng tài nguyên khi chúng tôi tăng giới hạn trong truy vấn của mình. Điều này dẫn đến các vấn đề giống như vấn đề đã trình bày ở trên khi chúng ta bị lừa khi nghĩ rằng việc quản lý bộ nhớ của chúng ta vẫn ổn. Nhưng trên thực tế, việc quản lý bộ nhớ của chúng ta bị thiếu sót nghiêm trọng và chúng ta có thể gặp các sự cố như sự cố được hiển thị ở trên

Ít nhất bạn có thể tránh được sự giả mạo ở trên [mặc dù bản thân nó sẽ không cải thiện việc sử dụng bộ nhớ của bạn] bằng cách sử dụng mô-đun

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
140.
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
140 được biên dịch dưới dạng một phần mở rộng PHP gốc và nó sử dụng trình quản lý bộ nhớ của PHP

Do đó, nếu chúng tôi chạy thử nghiệm trên bằng cách sử dụng

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
140 thay vì
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
135, chúng tôi sẽ có được bức tranh chân thực hơn nhiều về việc sử dụng bộ nhớ của chúng tôi

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
24

Và nó thậm chí còn tệ hơn thế, nhân tiện. Theo tài liệu PHP,

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
135 sử dụng gấp đôi tài nguyên so với
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
140 để lưu trữ dữ liệu, do đó, tập lệnh gốc sử dụng
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
135 thực sự đã sử dụng nhiều bộ nhớ hơn so với hiển thị ở đây [khoảng gấp đôi]

Để tránh những vấn đề như vậy, hãy cân nhắc giới hạn kích thước truy vấn của bạn và sử dụng vòng lặp với số lần lặp nhỏ; . g

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
25

Khi chúng tôi xem xét cả lỗi PHP này trở lên, chúng tôi nhận ra rằng có một sự cân bằng hợp lý mà mã của bạn cần đạt được một cách lý tưởng giữa, một mặt, truy vấn của bạn quá chi tiết và lặp đi lặp lại, so với. có từng truy vấn riêng lẻ của bạn quá lớn. Như với hầu hết mọi thứ trong cuộc sống, sự cân bằng là cần thiết;

Sai lầm thường gặp #6. Bỏ qua các vấn đề về Unicode/UTF-8

Theo một nghĩa nào đó, đây thực sự là một vấn đề trong chính PHP hơn là vấn đề bạn gặp phải khi gỡ lỗi PHP, nhưng nó chưa bao giờ được giải quyết thỏa đáng. Cốt lõi của PHP 6 là nhận biết Unicode, nhưng điều đó đã bị đình trệ khi quá trình phát triển PHP 6 bị đình chỉ vào năm 2010

Nhưng điều đó không có nghĩa là không cho phép nhà phát triển chuyển giao đúng UTF-8 và tránh giả định sai lầm rằng tất cả các chuỗi nhất thiết phải là “ASCII cũ đơn giản”. Mã không thể xử lý đúng các chuỗi không phải ASCII nổi tiếng là đã đưa các lỗi heisen vào mã của bạn. Ngay cả các cuộc gọi

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
147 đơn giản cũng có thể gây ra sự cố nếu ai đó có họ như “Schrödinger” cố gắng đăng ký vào hệ thống của bạn

Đây là một danh sách kiểm tra nhỏ để tránh những vấn đề như vậy trong mã của bạn

  • Nếu bạn không biết nhiều về Unicode và UTF-8, ít nhất bạn nên tìm hiểu những điều cơ bản. Có một mồi tuyệt vời ở đây
  • Đảm bảo luôn sử dụng các hàm
    $data = fetchRecordFromStorage[$storage, $identifier];
    if [!isset[$data['keyShouldBeSet']] {
        // do something here if 'keyShouldBeSet' is not set
    }
    
    148 thay vì các hàm chuỗi cũ [đảm bảo phần mở rộng “multibyte” được bao gồm trong bản dựng PHP của bạn]
  • Đảm bảo rằng cơ sở dữ liệu và bảng của bạn được đặt để sử dụng Unicode [nhiều bản dựng của MySQL vẫn sử dụng
    $data = fetchRecordFromStorage[$storage, $identifier];
    if [!isset[$data['keyShouldBeSet']] {
        // do something here if 'keyShouldBeSet' is not set
    }
    
    149 theo mặc định]
  • Hãy nhớ rằng
    $data = fetchRecordFromStorage[$storage, $identifier];
    if [!isset[$data['keyShouldBeSet']] {
        // do something here if 'keyShouldBeSet' is not set
    }
    
    150 chuyển đổi các ký hiệu không phải ASCII [và. g. , “Schrödinger” trở thành “Schr\u00f6dinger”] nhưng
    $data = fetchRecordFromStorage[$storage, $identifier];
    if [!isset[$data['keyShouldBeSet']] {
        // do something here if 'keyShouldBeSet' is not set
    }
    
    151 thì không
  • Đảm bảo các tệp mã PHP của bạn cũng được mã hóa UTF-8 để tránh xung đột khi nối các chuỗi với các hằng chuỗi được mã hóa cứng hoặc được định cấu hình

Một tài nguyên đặc biệt có giá trị về vấn đề này là Bài viết UTF-8 Primer cho PHP và MySQL của Francisco Claria trên blog này

Sai lầm thường gặp #7. Giả sử
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
152 sẽ luôn chứa dữ liệu POST của bạn

Mặc dù có tên như vậy, nhưng mảng _

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
152 không phải lúc nào cũng chứa dữ liệu POST của bạn và có thể dễ dàng bị trống. Để hiểu điều này, chúng ta hãy xem một ví dụ. Giả sử chúng tôi thực hiện yêu cầu máy chủ với cuộc gọi
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
154 như sau

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
26

[Nhân tiện, lưu ý

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
155 ở đây. Chúng tôi gửi dữ liệu dưới dạng JSON, khá phổ biến đối với API. Ví dụ, đó là mặc định để đăng trong dịch vụ AngularJS
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
156. ]

Về phía máy chủ trong ví dụ của chúng tôi, chúng tôi chỉ cần kết xuất mảng

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
152

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
27

Thật ngạc nhiên, kết quả sẽ là

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
28

tại sao?

Câu trả lời là PHP chỉ tự động phân tích cú pháp tải trọng POST khi nó có loại nội dung là

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
159 hoặc
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
160. Lý do cho điều này là do lịch sử - hai loại nội dung này về cơ bản là những loại duy nhất được sử dụng nhiều năm trước khi
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
152 của PHP được triển khai. Vì vậy, với bất kỳ loại nội dung nào khác [ngay cả những loại khá phổ biến hiện nay, như ________ 1162], PHP không tự động tải trọng tải POST

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
152 là một siêu toàn cầu, nên nếu chúng ta ghi đè lên nó một lần [tốt nhất là ở phần đầu trong tập lệnh của chúng ta], thì giá trị đã sửa đổi [i. e. , bao gồm tải trọng POST] sau đó sẽ được tham chiếu trong toàn bộ mã của chúng tôi. Điều này rất quan trọng vì
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
152 thường được sử dụng bởi các khung công tác PHP và hầu hết tất cả các tập lệnh tùy chỉnh để trích xuất và chuyển đổi dữ liệu yêu cầu

Vì vậy, ví dụ: khi xử lý tải trọng POST có loại nội dung là

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
162, chúng tôi cần phân tích cú pháp nội dung yêu cầu theo cách thủ công [i. e. , giải mã dữ liệu JSON] và ghi đè biến
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
152, như sau

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
29

Sau đó, khi chúng tôi kết xuất mảng

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
152, chúng tôi thấy rằng nó bao gồm chính xác tải trọng POST; . g

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
30

Sai lầm thường gặp #8. Nghĩ rằng PHP hỗ trợ kiểu dữ liệu ký tự

Nhìn vào đoạn mã mẫu này và thử đoán xem nó sẽ in gì

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
31

Nếu bạn trả lời từ 'a' đến 'z', bạn có thể ngạc nhiên khi biết mình đã sai

Có, nó sẽ in từ 'a' đến 'z', nhưng sau đó nó cũng sẽ in từ 'aa' đến 'yz'. Hãy xem tại sao

Trong PHP không có kiểu dữ liệu

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
168; . Với ý nghĩ đó, việc tăng
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
169
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
171 trong PHP mang lại
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
172

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
32

Tuy nhiên, để gây nhầm lẫn hơn nữa,

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
172 về mặt từ điển ít hơn
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
171

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
33

Đó là lý do tại sao mã mẫu được trình bày ở trên in các chữ cái từ

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
175 đến
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
171, nhưng sau đó cũng in ra từ
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
172 đến
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
178. Nó dừng lại khi đạt đến ________ 1179, đây là giá trị đầu tiên nó gặp mà nó “lớn hơn” ________ 1171

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
34

Trong trường hợp đó, đây là một cách để lặp đúng các giá trị 'a' đến 'z' trong PHP

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
35

Hay cách khác

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
36

Sai lầm thường gặp #9. Bỏ qua các tiêu chuẩn mã hóa

Mặc dù việc bỏ qua các tiêu chuẩn mã hóa không trực tiếp dẫn đến việc cần phải gỡ lỗi mã PHP, nhưng đây có lẽ vẫn là một trong những điều quan trọng nhất cần thảo luận ở đây

Bỏ qua các tiêu chuẩn mã hóa có thể gây ra hàng loạt vấn đề cho một dự án. Tốt nhất, nó dẫn đến mã không nhất quán [vì mọi nhà phát triển đều “làm việc của riêng họ”]. Nhưng tồi tệ nhất, nó tạo ra mã PHP không hoạt động hoặc có thể khó điều hướng [đôi khi gần như không thể], khiến việc gỡ lỗi, nâng cao, bảo trì trở nên cực kỳ khó khăn. Và điều đó có nghĩa là giảm năng suất cho nhóm của bạn, bao gồm rất nhiều nỗ lực lãng phí [hoặc ít nhất là không cần thiết].

May mắn thay cho các nhà phát triển PHP, có Khuyến nghị về Tiêu chuẩn PHP [PSR], bao gồm năm tiêu chuẩn sau

  • PSR-0. Tiêu chuẩn tự động tải
  • PSR-1. Tiêu chuẩn mã cơ bản
  • PSR-2. Hướng dẫn phong cách mã hóa
  • PSR-3. giao diện nhật ký
  • PSR-4. trình tải tự động

PSR ban đầu được tạo ra dựa trên đầu vào từ những người bảo trì các nền tảng được công nhận nhất trên thị trường. Zend, Drupal, Symfony, Joomla và những người khác đã đóng góp cho các tiêu chuẩn này và hiện đang tuân theo chúng. Ngay cả PEAR, đã cố gắng trở thành một tiêu chuẩn trong nhiều năm trước đó, giờ cũng tham gia vào PST

Theo một nghĩa nào đó, tiêu chuẩn mã hóa của bạn là gì hầu như không quan trọng, miễn là bạn đồng ý với một tiêu chuẩn và tuân theo nó, nhưng tuân theo PSR nói chung là một ý tưởng hay trừ khi bạn có một số lý do thuyết phục về dự án của mình để làm khác đi. Ngày càng có nhiều nhóm và dự án tuân thủ PSR. Tại thời điểm này, Tt chắc chắn được công nhận là “tiêu chuẩn” của phần lớn các nhà phát triển PHP, vì vậy việc sử dụng nó sẽ giúp đảm bảo rằng các nhà phát triển mới quen thuộc và thoải mái với tiêu chuẩn mã hóa của bạn khi họ tham gia nhóm của bạn

Sai lầm thường gặp #10. Lạm dụng
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
181

Một số nhà phát triển PHP thích sử dụng

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
181 để kiểm tra boolean cho mọi thứ. Tuy nhiên, có những trường hợp điều này có thể dẫn đến nhầm lẫn

Trước tiên, hãy quay lại mảng và các thể hiện của

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
130 [bắt chước mảng]. Với sự giống nhau của chúng, thật dễ dàng để giả định rằng các mảng và thực thể
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
130 sẽ hoạt động giống hệt nhau. Tuy nhiên, điều này chứng tỏ là một giả định nguy hiểm. Ví dụ, trong PHP 5. 0

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
37

Và để làm cho vấn đề trở nên tồi tệ hơn, kết quả sẽ khác trước PHP 5. 0

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
38

Thật không may, cách tiếp cận này khá phổ biến. Ví dụ: đây là cách

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
185 của Zend Framework 2 trả về dữ liệu khi gọi
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
186 trên kết quả
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
187 như tài liệu gợi ý. Nhà phát triển có thể dễ dàng trở thành nạn nhân của lỗi này với dữ liệu đó

Để tránh những vấn đề này, cách tiếp cận tốt hơn để kiểm tra cấu trúc mảng trống là sử dụng

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
188

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
39

Và ngẫu nhiên, vì PHP ép kiểu ________ 1189 thành ________ 417, nên ________ 1188 cũng có thể được sử dụng trong điều kiện _________ 1192 để kiểm tra các mảng trống. Cũng cần lưu ý rằng, trong PHP,

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
188 là độ phức tạp không đổi [hoạt động _______1194] trên các mảng, điều này càng làm rõ ràng hơn rằng đó là lựa chọn đúng đắn

Một ví dụ khác khi

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
181 có thể nguy hiểm là khi kết hợp nó với hàm lớp phép thuật
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
196. Hãy xác định hai lớp và có thuộc tính
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
123 trong cả hai

Trước tiên, hãy xác định một lớp

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
198 bao gồm
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
123 như một thuộc tính bình thường

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
0

Sau đó, hãy định nghĩa một lớp

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
200 sử dụng toán tử
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
196 ma thuật để truy cập thuộc tính
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
123 của nó

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
1

OK, bây giờ hãy xem điều gì sẽ xảy ra khi chúng ta cố gắng truy cập thuộc tính

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
123 của mỗi lớp này

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
2

Tốt cho đến nay

Nhưng bây giờ hãy xem điều gì sẽ xảy ra khi chúng ta gọi

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
181 trên mỗi

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
3

uh. Vì vậy, nếu chúng ta dựa vào

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
181, chúng ta có thể bị nhầm lẫn khi tin rằng thuộc tính
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
123 của
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
207 trống, trong khi trên thực tế, nó được đặt thành
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
208

Thật không may, nếu một lớp sử dụng hàm

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
196 ma thuật để truy xuất giá trị của thuộc tính, thì không có cách nào dễ dàng để kiểm tra xem giá trị thuộc tính đó có trống hay không. Bên ngoài phạm vi của lớp, bạn thực sự chỉ có thể kiểm tra xem giá trị
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
18 có được trả về hay không và điều đó không nhất thiết có nghĩa là khóa tương ứng không được đặt, vì nó thực sự có thể được đặt thành
$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
18

Ngược lại, nếu chúng ta cố gắng tham chiếu một thuộc tính không tồn tại của một thể hiện lớp

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
198, chúng ta sẽ nhận được một thông báo tương tự như sau

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
4

Vì vậy, điểm chính ở đây là phương pháp

$data = fetchRecordFromStorage[$storage, $identifier];
if [!isset[$data['keyShouldBeSet']] {
    // do something here if 'keyShouldBeSet' is not set
}
181 nên được sử dụng cẩn thận vì nó có thể gây nhầm lẫn - hoặc thậm chí có khả năng gây hiểu lầm - kết quả, nếu không cẩn thận

gói [lại

Tính dễ sử dụng của PHP có thể ru ngủ các nhà phát triển vào một cảm giác thoải mái sai lầm, khiến họ dễ bị gỡ lỗi PHP dài dòng do một số sắc thái và đặc điểm riêng của ngôn ngữ. Điều này có thể dẫn đến việc PHP không hoạt động và các vấn đề như được mô tả ở đây

Ngôn ngữ PHP đã phát triển đáng kể trong suốt lịch sử 20 năm của nó. Tự làm quen với sự tinh tế của nó là một nỗ lực đáng giá, vì nó sẽ giúp đảm bảo rằng phần mềm bạn sản xuất có khả năng mở rộng, mạnh mẽ và dễ bảo trì hơn.

Thẻ

PHP

Người làm việc tự do? Tìm công việc tiếp theo của bạn.

Việc làm Lập trình viên PHP

Xem thông tin đầy đủ

Ilya Sanoyan

kỹ sư phần mềm

Giới thiệu về tác giả

Ilya là nhà tư vấn CNTT, kiến ​​trúc web và quản lý với hơn một thập kỷ kinh nghiệm xây dựng và lãnh đạo nhóm, đào tạo đồng nghiệp và giúp các quy trình hoạt động lâu dài bằng cách xây dựng quy trình công việc hiệu quả và tài liệu minh bạch. Kiến thức miền của Ilya bao gồm robot, tin tức, bảo mật trực tuyến, chăm sóc sức khỏe, tiếp thị trực tuyến và du lịch

Thuê Ilya

bình luận

Phil nghèo

Bài viết rất hay, rất nhiều thông tin

Phil nghèo

Bài viết rất hay, rất nhiều thông tin

thebeline

Trời ạ, một số trong số này phù hợp với tôi [như các truy vấn bên trong các vòng lặp, chúng tôi thậm chí có một hoặc hai bộ [trước khi tôi viết lại chúng] các truy vấn bên trong các vòng lặp đã kích hoạt các vòng lặp tiếp theo với các truy vấn. đến mớ hỗn độn thối rữa]. Tuy nhiên, tôi không biết liệu tôi có nên gọi đây là 10 vấn đề phổ biến nhất hay không, cụ thể là bởi vì, trong khi những vấn đề này chắc chắn gây nhầm lẫn, các nhà phát triển thường gặp những vấn đề này và giải quyết chúng theo nhu cầu của họ một lần rồi tiếp tục. Bài viết không có lỗi, nhưng với một danh sách dài dằng dặc như PHP có, việc chọn ra chỉ 10 bài viết ngắn là điều không thể. Danh sách này thật điên rồ. http. //eev. ee/blog/2012/04/09/php-a-fractal-of-bad-design/

thebeline

Trời ạ, một số trong số này phù hợp với tôi [như các truy vấn bên trong các vòng lặp, chúng tôi thậm chí có một hoặc hai bộ [trước khi tôi viết lại chúng] các truy vấn bên trong các vòng lặp đã kích hoạt các vòng lặp tiếp theo với các truy vấn. đến mớ hỗn độn thối rữa]. Tuy nhiên, tôi không biết liệu tôi có nên gọi đây là 10 vấn đề phổ biến nhất hay không, cụ thể là bởi vì, trong khi những vấn đề này chắc chắn gây nhầm lẫn, các nhà phát triển thường gặp những vấn đề này và giải quyết chúng theo nhu cầu của họ một lần rồi tiếp tục. Bài viết không có lỗi, nhưng với một danh sách dài dằng dặc như PHP có, việc chọn ra chỉ 10 bài viết ngắn là điều không thể. Danh sách này thật điên rồ. http. //eev. ee/blog/2012/04/09/php-a-fractal-of-bad-design/

Alejandro Pablo Tkachuk

top 10 tuyệt vời

Alejandro Pablo Tkachuk

top 10 tuyệt vời

Wilhelm Murdoch

Ôi Chúa ơi. Đây là bài viết của tôi khi mọi người hỏi tôi tại sao tôi không thích ngôn ngữ này. Rõ ràng, mọi ngôn ngữ đều có những thiếu sót của nó, nhưng sau 10 năm sử dụng PHP, nó đã để lại một mùi vị rất tệ trong miệng tôi

Wilhelm Murdoch

Ôi Chúa ơi. Đây là bài viết của tôi khi mọi người hỏi tôi tại sao tôi không thích ngôn ngữ này. Rõ ràng, mọi ngôn ngữ đều có những thiếu sót của nó, nhưng sau 10 năm sử dụng PHP, nó đã để lại một mùi vị rất tệ trong miệng tôi

thợ đánh bóng

FWIW, trong #10 bạn nói "// PHP 5. 0 trở lên. $array = [];" Ký hiệu mảng đó KHÔNG hoạt động trong PHP 5. 0-5. 3, kể từ khi nó được giới thiệu trong PHP 5. 4

thợ đánh bóng

FWIW, trong #10 bạn nói "// PHP 5. 0 trở lên. $array = [];" Ký hiệu mảng đó KHÔNG hoạt động trong PHP 5. 0-5. 3, kể từ khi nó được giới thiệu trong PHP 5. 4

Bruno Seixas

Bài báo tuyệt vời. Cảm ơn =] Mỗi ​​ngày chúng ta có thể học được điều gì đó, cải thiện phong cách viết mã của mình. Điều này chỉ ra đúng hướng

Bruno Seixas

Bài báo tuyệt vời. Cảm ơn =] Mỗi ​​ngày chúng ta có thể học được điều gì đó, cải thiện phong cách viết mã của mình. Điều này chỉ ra đúng hướng

Scott

Mọi chuyện diễn ra rất suôn sẻ cho đến khi bạn đề cập đến PSR2. uh

Scott

Mọi chuyện diễn ra rất suôn sẻ cho đến khi bạn đề cập đến PSR2. uh

willhaben

Bây giờ ngôn ngữ của bạn là gì?

willhaben

Bây giờ ngôn ngữ của bạn là gì?

Vojtech Kurka

Chỉ là một cảnh báo. Khi sử dụng các mảng không trống, count[$array] có thể làm chậm mã của bạn một cách đáng kể. Hơn nữa, một số nhà phát triển có xu hướng sử dụng if[count[$arr]]. vòng lặp bên trong. Tôi sẽ không khuyến nghị thực hành này cho các mảng

Vojtech Kurka

Chỉ là một cảnh báo. Khi sử dụng các mảng không trống, count[$array] có thể làm chậm mã của bạn một cách đáng kể. Hơn nữa, một số nhà phát triển có xu hướng sử dụng if[count[$arr]]. vòng lặp bên trong. Tôi sẽ không khuyến nghị thực hành này cho các mảng

sương khói

Cảm ơn vì bài viết rất nhiều thông tin và tôi thích nó nhưng "Mặc dù tên của nó, isset[] không chỉ trả về false nếu một mục không tồn tại mà còn trả về false cho các giá trị null. " là sai, nó trả về true nếu giá trị nếu sai và chỉ trả về false nếu giá trị là null

sương khói

Cảm ơn vì bài viết rất nhiều thông tin và tôi thích nó nhưng "Mặc dù tên của nó, isset[] không chỉ trả về false nếu một mục không tồn tại mà còn trả về false cho các giá trị null. " là sai, nó trả về true nếu giá trị nếu sai và chỉ trả về false nếu giá trị là null

Maxim Naguchev

> Thật không may, nếu một lớp sử dụng hàm __get[] ma thuật để truy xuất giá trị của thuộc tính, > không có cách nào dễ dàng để kiểm tra xem giá trị thuộc tính đó có trống hay không. Nó không đúng. Xây dựng empty[$var] trước tiên hãy thử gọi isset[] và, nếu biến được đặt, sau đó kiểm tra xem biến có trống hay không. Vì vậy, nếu lớp sử dụng phương thức ma thuật _get[], thì nó phải nhận ra phương thức ma thuật _isset[]. Và trống[] sẽ hoạt động bình thường

Maxim Naguchev

> Thật không may, nếu một lớp sử dụng hàm __get[] ma thuật để truy xuất giá trị của thuộc tính, > không có cách nào dễ dàng để kiểm tra xem giá trị thuộc tính đó có trống hay không. Nó không đúng. Xây dựng empty[$var] trước tiên hãy thử gọi isset[] và, nếu biến được đặt, sau đó kiểm tra xem biến có trống hay không. Vì vậy, nếu lớp sử dụng phương thức ma thuật _get[], thì nó phải nhận ra phương thức ma thuật _isset[]. Và trống[] sẽ hoạt động bình thường

Myroniar

hữu ích, cảm ơn

Myroniar

hữu ích, cảm ơn

dusan lukic

Cảm ơn vì bài viết rất hữu ích này. Tôi chỉ muốn sửa một chút, bạn nói rằng "PHP luôn truyền đối tượng theo tham chiếu", điều này thực tế không hoàn toàn đúng, vì PHP sử dụng cơ chế đặc biệt cho các đối tượng tương tự như truyền theo tham chiếu, đó là câu thứ hai trên trang này. http. //php. net/manual/vi/ngôn ngữ. oop5. người giới thiệu. php Ngoài ra, bài viết tuyệt vời

dusan lukic

Cảm ơn vì bài viết rất hữu ích này. Tôi chỉ muốn sửa một chút, bạn nói rằng "PHP luôn truyền đối tượng theo tham chiếu", điều này thực tế không hoàn toàn đúng, vì PHP sử dụng cơ chế đặc biệt cho các đối tượng tương tự như truyền theo tham chiếu, đó là câu thứ hai trên trang này. http. //php. net/manual/vi/ngôn ngữ. oop5. người giới thiệu. php Ngoài ra, bài viết tuyệt vời

Roy

Bài báo được viết rất tốt với nội dung gốc. Tốt lắm

Roy

Bài báo được viết rất tốt với nội dung gốc. Tốt lắm

Donato C. Layne Gonzales

Về #2, $_POST['active'] sẽ tạo E_NOTICE nếu khóa không tồn tại [các hộp kiểm và radio không được chọn] Nếu bạn quan tâm đến hiệu suất và bảo mật của PHP, điều này rất quan trọng. array_key_exists là tùy chọn tốt hơn như đã giải thích. Trân trọng

Donato C. Layne Gonzales

Về #2, $_POST['active'] sẽ tạo E_NOTICE nếu khóa không tồn tại [các hộp kiểm và radio không được chọn] Nếu bạn quan tâm đến hiệu suất và bảo mật của PHP, điều này rất quan trọng. array_key_exists là tùy chọn tốt hơn như đã giải thích. Trân trọng

Aschwin Wesselius

Đáng ngạc nhiên là không ai đề cập đến việc bạn sử dụng /root/test. php. Tôi biết, đó là môi trường cục bộ và tất cả, nhưng vẫn chạy các tập lệnh kiểm tra trong thư mục gốc của bạn, đặc biệt là các kiểm tra ngốn nhiều bộ nhớ. Điều đó được thực hiện trên mục đích?

Aschwin Wesselius

Đáng ngạc nhiên là không ai đề cập đến việc bạn sử dụng /root/test. php. Tôi biết, đó là môi trường cục bộ và tất cả, nhưng vẫn chạy các tập lệnh kiểm tra trong thư mục gốc của bạn, đặc biệt là các kiểm tra ngốn nhiều bộ nhớ. Điều đó được thực hiện trên mục đích?

ajaniashish

Bài viết xuất sắc Ilya, hoàn toàn đồng ý với nhận định của bạn "hàng giờ vò đầu bứt tóc". Thông thường, khi nói đến việc tối ưu hóa tốc độ trang web, chúng tôi thấy các truy vấn không cần thiết bên trong các vòng lặp. công cụ tuyệt vời

ajaniashish

Bài viết xuất sắc Ilya, hoàn toàn đồng ý với nhận định của bạn "hàng giờ vò đầu bứt tóc". Thông thường, khi nói đến việc tối ưu hóa tốc độ trang web, chúng tôi thấy các truy vấn không cần thiết bên trong các vòng lặp. công cụ tuyệt vời

Scott

Bởi vì PSR-2 có ý định trở thành Tiêu chuẩn mã hóa thực sự duy nhất. Có, các tiêu chuẩn mã hóa là bắt buộc, nhưng không nhất thiết phải là PSR-2. Ngay cả bài viết này cũng nói rằng bạn cần một "lý do thuyết phục" để không sử dụng nó, điều đơn giản là không đúng

Scott

Bởi vì PSR-2 có ý định trở thành Tiêu chuẩn mã hóa thực sự duy nhất. Có, các tiêu chuẩn mã hóa là bắt buộc, nhưng không nhất thiết phải là PSR-2. Ngay cả bài viết này cũng nói rằng bạn cần một "lý do thuyết phục" để không sử dụng nó, điều đơn giản là không đúng

Jason EdgeCombe

Trong mẹo số 4 và số 5, sử dụng truy vấn [] với nối chuỗi là một ví dụ trong sách giáo khoa về lỗ hổng SQL injection. Tốt hơn là sử dụng các câu lệnh đã chuẩn bị sẵn hoặc ít nhất là cảnh báo người đọc rằng các biến đầu vào phải được làm sạch trước. Vui lòng cập nhật bài viết để mọi người không mù quáng sử dụng mã ví dụ và nghĩ rằng nó an toàn. Bài viết này cũng cần có ngày khi bài viết được viết hoặc cập nhật lần cuối để người đọc có thể biết liệu thông tin có cũ không

Jason EdgeCombe

Trong mẹo số 4 và số 5, sử dụng truy vấn [] với nối chuỗi là một ví dụ trong sách giáo khoa về lỗ hổng SQL injection. Tốt hơn là sử dụng các câu lệnh đã chuẩn bị sẵn hoặc ít nhất là cảnh báo người đọc rằng các biến đầu vào phải được làm sạch trước. Vui lòng cập nhật bài viết để mọi người không mù quáng sử dụng mã ví dụ và nghĩ rằng nó an toàn. Bài viết này cũng cần có ngày khi bài viết được viết hoặc cập nhật lần cuối để người đọc có thể biết liệu thông tin có cũ không

Công viên Grant Wesley

Đó là điều tương tự. null là giá trị null duy nhất

Công viên Grant Wesley

Đó là điều tương tự. null là giá trị null duy nhất

Jeff Mattson

Trong Sai lầm phổ biến #2. Ví dụ của bạn không nên đọc nếu [. $_POST['đang hoạt động']] { echo 'bài đăng không hoạt động';

Jeff Mattson

Trong Sai lầm phổ biến #2. Ví dụ của bạn không nên đọc nếu [. $_POST['đang hoạt động']] { echo 'bài đăng không hoạt động';

M. S. vignesh

có cách nào khác không?

M. S. vignesh

có cách nào khác không?

Vojtech Kurka

sử dụng một biến làm bộ đếm

Vojtech Kurka

sử dụng một biến làm bộ đếm

erutan409

Tôi thấy những điều sau đây là vô lý. Dấu ngoặc mở cho lớp PHẢI ở dòng tiếp theo và dấu ngoặc đóng PHẢI ở dòng tiếp theo sau phần thân. Dấu ngoặc mở cho các phương thức PHẢI đi trên dòng tiếp theo và dấu ngoặc đóng PHẢI đi trên dòng tiếp theo sau phần thân. Vì vậy, tôi cũng gặp một số vấn đề với PSR-2

erutan409

Tôi thấy những điều sau đây là vô lý. Dấu ngoặc mở cho lớp PHẢI ở dòng tiếp theo và dấu ngoặc đóng PHẢI ở dòng tiếp theo sau phần thân. Dấu ngoặc mở cho các phương thức PHẢI đi trên dòng tiếp theo và dấu ngoặc đóng PHẢI đi trên dòng tiếp theo sau phần thân. Vì vậy, tôi cũng gặp một số vấn đề với PSR-2

phat_boi

Thật. Tuy nhiên, tiêu chuẩn nào được sử dụng không quan trọng miễn là nó rộng khắp tổ chức. Bạn không vào công ty mà chỉ bắt đầu sử dụng PSR-2 khi đã có một tiêu chuẩn được thiết lập. Bạn kết thúc với một mớ hỗn độn theo cách đó

phat_boi

Thật. Tuy nhiên, tiêu chuẩn nào được sử dụng không quan trọng miễn là nó rộng khắp tổ chức. Bạn không vào công ty mà chỉ bắt đầu sử dụng PSR-2 khi đã có một tiêu chuẩn được thiết lập. Bạn kết thúc với một mớ hỗn độn theo cách đó

Julian Chappell

+1. tất cả kẻ giết người không phụ

Julian Chappell

+1. tất cả kẻ giết người không phụ

juukie14

👍 mẹo hay

juukie14

👍 mẹo hay

không ai tên

> Sai lầm thường gặp #5 Đó không phải là sai lầm thực sự. Hãy xem xét, nếu truy vấn của bạn có thời lượng chạy 1 giây/truy vấn, vậy điều gì xảy ra nếu bạn cần 50-100 truy vấn như vậy? . Nhưng bạn phải xóa bộ nhớ tài nguyên sau khi nhận được kết quả truy vấn nếu bạn có ít hơn một số truy vấn đơn giản. Và về PSR-1 > Tên lớp PHẢI được khai báo trong StudlyCaps Đây là điều điên rồ nhất trong PSR

không ai tên

> Sai lầm thường gặp #5 Đó không phải là sai lầm thực sự. Hãy xem xét, nếu truy vấn của bạn có thời lượng chạy 1 giây/truy vấn, vậy điều gì xảy ra nếu bạn cần 50-100 truy vấn như vậy? . Nhưng bạn phải xóa bộ nhớ tài nguyên sau khi nhận được kết quả truy vấn nếu bạn có ít hơn một số truy vấn đơn giản. Và về PSR-1 > Tên lớp PHẢI được khai báo trong StudlyCaps Đây là điều điên rồ nhất trong PSR

không ai tên

> Sai lầm thường gặp #10. Bạn không bao giờ nên sử dụng ArrayObject thay vì mảng gốc. Nhưng bạn nên đặt kiểu định nghĩa khi bạn cần một mảng làm đối số. Bạn phải luôn biết những gì bạn đang mong đợi thì sẽ không bao giờ mắc lỗi trong ví dụ trống/isset

không ai tên

> Sai lầm thường gặp #10. Bạn không bao giờ nên sử dụng ArrayObject thay vì mảng gốc. Nhưng bạn nên đặt kiểu định nghĩa khi bạn cần một mảng làm đối số. Bạn phải luôn biết những gì bạn đang mong đợi thì sẽ không bao giờ mắc lỗi trong ví dụ trống/isset

Người vượt qua Idemudia

Tuyệt vời, cảm ơn bạn

Người vượt qua Idemudia

Tuyệt vời, cảm ơn bạn

Erik Bêlarut

một giải pháp tốt cho lỗi #1 thay vì nhớ gọi unset[] sẽ là sử dụng array_map[]

Erik Bêlarut

một giải pháp tốt cho lỗi #1 thay vì nhớ gọi unset[] sẽ là sử dụng array_map[]

Evgeny Chernyavsky

cũng như mảng_walk[]

Evgeny Chernyavsky

cũng như mảng_walk[]

timw4mail

Tuy nhiên, bài đăng đó có những điểm không chính xác vào thời điểm đó và ít liên quan hơn bao giờ hết. Tôi sẽ không nói rằng PHP là một ngôn ngữ 'thuần' hay 'sạch', nhưng nói chung nó không dễ bị lỗi như 'bài viết' đó có vẻ như vậy

timw4mail

Tuy nhiên, bài đăng đó có những điểm không chính xác vào thời điểm đó và ít liên quan hơn bao giờ hết. Tôi sẽ không nói rằng PHP là một ngôn ngữ 'thuần' hay 'sạch', nhưng nói chung nó không dễ bị lỗi như 'bài viết' đó có vẻ như vậy

Ricardo Sánchez

Tại sao không chỉ. mảng $?. ] Chúng tôi biết biến luôn được đặt, luôn luôn. Tại sao bạn cố gắng sử dụng một biến có thể không tồn tại? . Các biến phải luôn tồn tại. cộng với isset và trống dẫn đến lỗi đánh máy trong tập lệnh. $myVars = 0; . Hãy để trình biên dịch phàn nàn thay vì im lặng với @/isset/empty. PSR chỉ dành cho mục đích sử dụng nội bộ. Nó KHÔNG BAO GIỜ có ý định được sử dụng bởi người khác. như họ nói trong Câu hỏi thường gặp. "Không ai trong nhóm muốn nói với bạn, với tư cách là một lập trình viên, cách xây dựng ứng dụng của bạn. "Vì vậy, đó là một lỗi phổ biến mà các lập trình viên php mắc phải, làm theo một khuyến nghị không dành cho họ. ]

Ricardo Sánchez

Tại sao không chỉ. mảng $?. ] Chúng tôi biết biến luôn được đặt, luôn luôn. Tại sao bạn cố gắng sử dụng một biến có thể không tồn tại? . Các biến phải luôn tồn tại. cộng với isset và trống dẫn đến lỗi đánh máy trong tập lệnh. $myVars = 0; . Hãy để trình biên dịch phàn nàn thay vì im lặng với @/isset/empty. PSR chỉ dành cho mục đích sử dụng nội bộ. Nó KHÔNG BAO GIỜ có ý định được sử dụng bởi người khác. như họ nói trong Câu hỏi thường gặp. "Không ai trong nhóm muốn nói với bạn, với tư cách là một lập trình viên, cách xây dựng ứng dụng của bạn. "Vì vậy, đó là một lỗi phổ biến mà các lập trình viên php mắc phải, làm theo một khuyến nghị không dành cho họ. ]

Marco Cante

Dành cho 2. get_define_vars với array_key_exist rất chậm nếu bạn đặt nhiều biến, phải không?

Marco Cante

Dành cho 2. get_define_vars với array_key_exist rất chậm nếu bạn đặt nhiều biến, phải không?

khổ hạnh

đó là vấn đề về quan điểm và các tiêu chuẩn được xác định bởi thực tiễn của đa số. Tại sao lại vô lý như vậy? . Các định nghĩa lớp và định nghĩa phương thức có thể dài [đôi khi ghi nhật ký vô lý] để dấu ngoặc mở có thể ở bên phải. Để nó tự động xuống dòng tiếp theo giúp tiết kiệm khả năng đọc và đó chỉ là một quy tắc giúp giảm ô nhiễm

khổ hạnh

đó là vấn đề về quan điểm và các tiêu chuẩn được xác định bởi thực tiễn của đa số. Tại sao lại vô lý như vậy? . Các định nghĩa lớp và định nghĩa phương thức có thể dài [đôi khi ghi nhật ký vô lý] để dấu ngoặc mở có thể ở bên phải. Để nó tự động xuống dòng tiếp theo giúp tiết kiệm khả năng đọc và đó chỉ là một quy tắc giúp giảm ô nhiễm

khổ hạnh

1. Tiện ích mở rộng mysql được đề cập ở đó không được dùng nữa ngay cả tại thời điểm viết bài. Đó là một vấn đề mà thậm chí sau đó không cần giải pháp mã. 2. Nghiêm túc mà nói, tác giả đang đưa ra một giải pháp thay thế, một phương pháp được loại bỏ có chủ đích khỏi php lõi [trả lại bằng cách tham khảo] mà tất cả các hướng dẫn thực hành tốt nhất đều khuyên chống lại [trừ khi có lý do thực sự chính đáng] vì lý do duy nhất là cho phép thay đổi thành viên lớp RIÊNG TƯ ? . tại sao thúc đẩy trở lại bằng cách tham khảo?

khổ hạnh

1. Tiện ích mở rộng mysql được đề cập ở đó không được dùng nữa ngay cả tại thời điểm viết bài. Đó là một vấn đề mà thậm chí sau đó không cần giải pháp mã. 2. Nghiêm túc mà nói, tác giả đang đưa ra một giải pháp thay thế, một phương pháp được loại bỏ có chủ đích khỏi php lõi [trả lại bằng cách tham khảo] mà tất cả các hướng dẫn thực hành tốt nhất đều khuyên chống lại [trừ khi có lý do thực sự chính đáng] vì lý do duy nhất là cho phép thay đổi thành viên lớp RIÊNG TƯ ? . tại sao thúc đẩy trở lại bằng cách tham khảo?

govindrajput

Bài viết hay và thông tin rất hay có trong bài đăng này vì vậy tôi thích bài đăng này cảm ơn

govindrajput

Bài viết hay và thông tin rất hay có trong bài đăng này vì vậy tôi thích bài đăng này cảm ơn

CÔNG TY TÀI CHÍNH NĂM SAO

Bạn có cần một khoản vay để hợp nhất khoản nợ của mình ở mức 3% không? . Chúng tôi cung cấp dịch vụ tư vấn tài chính cho khách hàng, các công ty đang tìm kiếm khoản nợ / tài trợ cho vay và tìm kiếm vốn lưu động để bắt đầu một doanh nghiệp mới hoặc để mở rộng hoạt động kinh doanh hiện có. Các bên trung gian / Tư vấn / Môi giới được chào đón mang theo khách hàng của họ và được bảo vệ 100%. Các bên quan tâm nên liên hệ với chúng tôi để biết thêm thông tin qua email. fivestarfinancecompany@gmail. com Để gọi hoặc whatsapp chúng tôi +16042659337

CÔNG TY TÀI CHÍNH NĂM SAO

Bạn có cần một khoản vay để hợp nhất khoản nợ của mình ở mức 3% không? . Chúng tôi cung cấp dịch vụ tư vấn tài chính cho khách hàng, các công ty đang tìm kiếm khoản nợ / tài trợ cho vay và tìm kiếm vốn lưu động để bắt đầu một doanh nghiệp mới hoặc để mở rộng hoạt động kinh doanh hiện có. Các bên trung gian / Tư vấn / Môi giới được chào đón mang theo khách hàng của họ và được bảo vệ 100%. Các bên quan tâm nên liên hệ với chúng tôi để biết thêm thông tin qua email. fivestarfinancecompany@gmail. com Để gọi hoặc whatsapp chúng tôi +16042659337

điểm ngon

Heyas, I may be 4 or 5 years to late for a response, but no one seems to know the right answer to this one. If I create a php index file with html tags neatly laid out which is worse: A] Having a bunch of php code on top of the index php file and some in the middle for example "

Chủ Đề