Hướng dẫn should i use empty php? - tôi có nên sử dụng php trống không?

Tôi nhận ra rằng tôi rất nghiêm ngặt về việc sử dụng chức năng trống PHP trong đánh giá mã. Thực sự có bất kỳ lý do nào để sử dụng nó theo ý kiến ​​của tôi:

  • Nó kiểm tra cả cho sự tồn tại và giá trị không giả mạo và như một người đọc, ý định của các nhà văn không rõ ràng.
  • Nó không giao tiếp với biến A loại A có, nhìn thấy trống ($ giá trị) không thu hẹp giá trị là đủ.empty($value) does not narrow down what value is enough.
  • Nó ẩn lỗi do lỗi chính tả trong tên biến được truyền đến trống.

Đây là danh sách các lựa chọn thay thế mà tôi khuyên bạn nên sử dụng thay vì trống.

Kiểm tra rằng chuỗi có độ dài 0

// Replace
if (empty($string)) {
}

// With
if (strlen($string) === 0) {
}

Sử dụng Strlen giao tiếp rằng biến là một chuỗi.

Kiểm tra mảng đó không có yếu tố

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}

Sử dụng Count giao tiếp rằng biến là một mảng.

Kiểm tra xem mảng có khóa không

// Replace
if (empty($array[$key])) {
}

// With
if (array_key_exists($array, $key)) {
}

// or if you know that existance also means a non-empty value
if (isset($array[$key])) {
}

Cả Array_KEY_EXISTS và ISSET truyền đạt rõ ràng hơn rằng mã quan tâm đến sự tồn tại của một khóa chứ không phải nó giả định sự tồn tại và chỉ kiểm tra một giá trị không trống.

Kiểm tra xem một biến được khai báo trong phạm vi

// Replace
if (empty($var)) {
}

// With
if (isset($var)) {
}

Trong trường hợp này, bạn cũng có thể sử dụng ISSET, nhưng nói chung nếu bạn cần kiểm tra điều này thì dù sao thì có điều gì đó không ổn với mã. Một biến phải luôn luôn có hoặc không được khai báo trong phạm vi hiện tại, không nên có sự không chắc chắn về nó.

Kiểm tra nếu một biến là null

// Replace
if (empty($var)) {
}

// With
if ($var === null) {
}

Mã rõ ràng hơn là một bài kiểm tra cho biến là NULL và không vô tình đúng khi 0, giả hoặc chuỗi trống.

Kiểm tra nếu một biến là 0

// Replace
if (empty($var)) {
}

// With
if ($var === 0) {
}

Giao tiếp biến đó là số nguyên.

Kiểm tra nếu một biến là sai

// Replace
if (empty($var)) {
}

// With
if ($var === false) {
}
if (!$var) {
}

Giao tiếp biến đó là Boolean.

Chuyện gì xảy ra nếu?

Bây giờ điều gì sẽ xảy ra nếu tôi muốn kiểm tra sự tồn tại và không trống rỗng cho một phím mảng? Sử dụng hai điều kiện làm cho điều này rõ ràng hơn.

Bây giờ điều gì sẽ xảy ra nếu tôi quan tâm đến hiệu suất của trống là một ngôn ngữ xây dựng so với gọi một hàm nội bộ như strlen hoặc đếm? Không phải lo lắng, cả Strlen và Count đều được Opcache tối ưu hóa nếu bạn đặt trước chúng bằng một dấu gạch chéo ngược để gọi trực tiếp cho họ trong không gian tên toàn cầu.

Thực thi tự động

Được trang bị mã PHP Sniffer và Thi thiên Tôi rất vui khi thực thi các quy tắc với các plugin tùy chỉnh của riêng tôi cho một trong hai công cụ.

Chúng tôi có một plugin thánh vịnh tùy chỉnh trong cơ sở mã Tideways của chúng tôi và tôi đã thêm một thử nghiệm tự động để trống bao gồm một đề xuất cho sự thay thế phù hợp dựa trên loại. Nó không hoàn hảo và chưa nắm bắt được tất cả các loại cách sử dụng trống khác nhau, nhưng đó là một khởi đầu đủ tốt. Xem ý chính này để biết mã và cách đưa nó vào PSALM.XML của bạn.

Đăng vào ngày 19 tháng 2 năm 2021 bởi Benjamin Eberlei

Đăng ký nhận bản tin của tôi để được thông báo khi tôi đăng nội dung mới trên blog này và với nội dung độc quyền không thường xuyên cho người đăng ký.

Bằng cách nhấp vào nút Đăng ký, tôi đồng ý với Benjamin Eberlei để giữ tên và địa chỉ email của tôi cho các mục đích liên hệ với tôi với một bản tin về các chủ đề của blog này. Bạn có thể hủy đăng ký bằng một lần nhấp bất cứ lúc nào và rút lại sự đồng ý của bạn. Không có thư rác. Tôi sẽ không bao giờ chia sẻ địa chỉ e-mail của bạn. Chính sách bảo mật

Đó là một lỗ hổng được biết đến trong PHP rằng các chức năng trong thư viện tiêu chuẩn không nhất quán. Một số trong số họ có một API khủng khiếp có thể trả lại bất cứ điều gì từ đối tượng đến null và sai. Một số trong số họ lấy các đối số bằng cách tham khảo, như ví dụ các chức năng sắp xếp mảng làm. Tóm lại, có một chút tính năng hoạt động theo kiểu phức tạp làm cho mã tồi tệ hơn.

Một phần của việc trở thành một lập trình viên giỏi là xác định các tính năng trong ngôn ngữ làm tổn thương mã, phần mềm chúng tôi đang xây dựng. Khi những điều đó được xác định, một lập trình viên tốt sẽ giảm thiểu tác động của việc sử dụng các tính năng đó hoặc hoàn toàn tránh sử dụng chúng nếu có thể.

Vì vậy, gần đây tôi đã vấp ngã khá nhiều về các chức năng

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
3 và
// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
4. Các chức năng này khai thác thực sự tốt vào khía cạnh được đánh máy và thủ tục yếu của PHP. Nếu bạn đã cưỡi sóng PHP hiện đại trong một thời gian, bạn đã học cách ghét khía cạnh đó của PHP.

ISSET

Chức năng ISSET trong tài liệu PHP:

ISSET - Xác định xem một biến được khai báo và khác với NULL "

Và ví dụ:

php > var_dump(isset($foo));
bool(false)

php > $foo = 'bar';
php > var_dump(isset($foo));
bool(true)

php > $foo = null;
php > var_dump(isset($foo));
bool(false)

php > $list = ['foo' => 'bar'];
php > var_dump(isset($list['baz']));
bool(false)

php > var_dump(isset($list['foo']));
bool(true)

Nhìn vào định nghĩa trong các tài liệu PHP, chúng ta có thể thấy rằng chức năng thực hiện hai điều.

  1. Xác định xem biến có được khai báo không
  2. Xác định xem biến có khác với NULL không

Trên ví dụ, có ba cách sử dụng mà tôi đã chứng kiến ​​là trường hợp sử dụng cho

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
3. Null kiểm tra và kiểm tra biến đó được khai báo, nhưng cũng kiểm tra xem mảng có khóa không. Hai đầu tiên khớp với định nghĩa trong tài liệu PHP và thứ ba chỉ là thứ mà các nhà phát triển đã bắt đầu sử dụng.

Bây giờ, điều tại sao sử dụng

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
3 nên tránh chính xác là điều mà nó hứa hẹn. Nó làm hai điều. Điều này gây ra sự nhầm lẫn cho người đọc.two things. This causes confusion to the reader.

Chúng tôi không biết nếu một biến được khai báo? Làm sao chuyện này lại xảy ra?

Hoặc là chúng tôi đang làm một cái gì đó rất thông minh, như chúng tôi biết là một thói quen khủng khiếp, hoặc chúng tôi đang làm việc với một hệ thống di sản hoàn toàn thủ tục.

Nếu chúng ta biết rằng biến được khai báo, thì lý do duy nhất chúng ta sẽ sử dụng

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
3 là để kiểm tra null. Và đối với điều đó, tôi khuyên bạn nên kiểm tra null rõ ràng. Trong mã này rõ ràng bạn thấy dễ dàng khi
// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
8 đến mà không có bất kỳ đột biến nào. IRL Có thể có nhiều logic hơn giữa các tuyên bố này.

$customer = Customer::find($customerId);
if ($customer === null) {
    // throw
}

Một giải pháp thay thế sử dụng cùng một giải pháp sẽ còn rõ ràng hơn và rõ ràng hơn đối với người đọc sẽ là kiểm tra null với

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
9. Trong trường hợp này, chúng tôi biết chính xác những gì chúng tôi đang xử lý khi chúng tôi làm việc với
// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
8.

$customer = Customer::find($customerId);
if (!$customer instanceof Customer) {
    // throw
}

Tình huống thứ ba tôi đã thấy và cá nhân sử dụng khá nhiều, đang kiểm tra xem một mảng có khóa cụ thể không:

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
0

Đây cũng là một trường hợp khác mà đã có một cách rõ ràng hơn để xử lý vấn đề.

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
1

Tôi thừa nhận, sử dụng

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
3 không phải là hành vi phạm tội nghiêm trọng nhất. Nhưng nó vẫn thường được sử dụng để kiểm tra hoặc kiểm tra null nếu biến được khai báo, hầu như không bao giờ cho cả hai. Rõ ràng hơn trong những trường hợp này sẽ giúp người đọc mã của bạn.

trống rỗng

Chức năng trống trong tài liệu PHP:

Trả về sai nếu var tồn tại và có giá trị không trống, khác không. Nếu không thì trả về đúng.

Các giá trị sau được coi là trống: ""
"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)

Wow, vì vậy tôi có thể đang xử lý một chuỗi, số nguyên, phao, boolean, null hoặc một mảng. Nếu

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
3 xấu khi làm hai việc,
// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
4 là một con thú hoàn toàn khác. Nó làm bảy điều! Nó trả lời cho bảy câu hỏi khác nhau.seven things! It answers to seven different questions.

Bước đầu tiên để giải quyết vấn đề là sử dụng các gợi ý loại ở khắp mọi nơi. Sử dụng gợi ý loại đối số và gợi ý loại trả về trong mọi phương thức và chức năng bạn viết. Lưu ý: Điều này áp dụng cho những nhà phát triển làm việc với PHP7 trở lên.every method and function you write. NOTE: This applies to those developers who work with PHP7 or higher.

Bước thứ hai là sử dụng các điều kiện rõ ràng hơn. Điều này có nghĩa là những người đọc mã không phải đào sâu vào các chi tiết nhàm chán khi cố gắng hiểu những gì bạn đang cố gắng thực hiện. Sử dụng so sánh nghiêm ngặt (

// Replace
if (empty($array[$key])) {
}

// With
if (array_key_exists($array, $key)) {
}

// or if you know that existance also means a non-empty value
if (isset($array[$key])) {
}
4) là rất quan trọng.

// Replace
if (empty($array)) {
}

// With
if (count($array) === 0) {
}
2

Như một lưu ý phụ, sử dụng gợi ý loại trở lại là một thực tiễn rất tốt. Nó sẽ dẫn đến các giao diện rõ ràng hơn. Khi bạn có một gợi ý loại trả lại tại chỗ, không có cách nào bạn có thể trả lại nhiều thứ khác nhau từ phương thức của mình (giả sử bạn không sử dụng gợi ý loại vô hiệu, như bạn không nên).

Bạn đã sẵn sàng để ném

// Replace
if (empty($array[$key])) {
}

// With
if (array_key_exists($array, $key)) {
}

// or if you know that existance also means a non-empty value
if (isset($array[$key])) {
}
5 và
// Replace
if (empty($array[$key])) {
}

// With
if (array_key_exists($array, $key)) {
}

// or if you know that existance also means a non-empty value
if (isset($array[$key])) {
}
6 vào thùng rác lịch sử? Nói cho tôi biết bạn nghĩ gì!

Tôi có nên sử dụng ISSET hay PHP trống không?

Hàm trống () là một hàm sẵn có trong PHP được sử dụng để kiểm tra xem một biến có trống hay không.Hàm isset () sẽ tạo cảnh báo hoặc thông báo điện tử khi biến không tồn tại.Hàm trống () sẽ không tạo ra bất kỳ cảnh báo hoặc thông báo điện tử nào khi biến không tồn tại.The isset() function will generate a warning or e-notice when the variable does not exists. The empty() function will not generate any warning or e-notice when the variable does not exists.

Việc sử dụng trống trong PHP là gì?

Hàm php trống () hàm trống () kiểm tra xem một biến có trống hay không.Hàm này trả về sai nếu biến tồn tại và không trống, nếu không nó sẽ trả về đúng.checks whether a variable is empty or not. This function returns false if the variable exists and is not empty, otherwise it returns true.

Trống có giống như null PHP không?

Hàm trống () trả về true nếu giá trị của một biến đánh giá là sai.Điều này có thể có nghĩa là chuỗi trống, null, số nguyên 0 hoặc một mảng không có phần tử.Mặt khác, is_null () sẽ chỉ trả về true nếu biến có giá trị null. . This could mean the empty string, NULL , the integer 0 , or an array with no elements. On the other hand, is_null() will return true only if the variable has the value NULL .

0 được coi là php trống?

Những điều sau đây được coi là trống: ""0 (0 as an integer) 0.0 (0 as a float)