2011-08-31 28 views
9

thể trùng lặp:
Why do some experienced programmers write expressions this way?Có lợi ích gì khi sử dụng null đầu tiên trong PHP?

Tôi chỉ tò mò về vấn đề này: trong hầu hết các khuôn khổ/dự án mã nguồn mở tôi đã nghiên cứu, tôi thường nhìn thấy mã như thế này ...

<?php 

if (null === self::$_instance) { 
    self::$_instance = new self(); 
} 

Đặc biệt dòng này ...

if (null === self::$_instance) { 

Tại sao sử dụng null trong số đầu tiên của báo cáo kết quả if thay vì cách khác xung quanh? ...

if (self::$_instance === null) { 

tôi nhận ra có lẽ là không tăng hiệu suất hoặc bất cứ điều gì như thế. Đây có phải chỉ là một sở thích hoặc là một số loại tiêu chuẩn mã hóa mà tôi đã bỏ qua?

+2

Cá nhân, tôi có khuynh hướng nói rằng tất cả chúng phải là 'if (! Self :: $ _ instance)' – cwallenpoole

+0

Nếu đây không phải là một quảng cáo, tôi sẽ ăn bàn phím của mình –

+5

Kiểu ký hiệu đó được gọi là "biểu thức yoda "hoặc" điều kiện yoda ". – mario

Trả lời

12

Nó ngăn cản bạn vô tình gán giá trị cho một biến, đặc biệt là khi chỉ sử dụng kiểu so sánh lỏng (==):

if (self::$_instance = NULL) { … } // WHOOPS!, self::$_instance is now NULL 

phong cách này của điều kiện thường được gọi là yoda conditions. Hiệu suất khôn ngoan không có sự khác biệt, cả hai báo cáo là tương đương.

0

Nó không phải đặc biệt để null - Tôi đã nhìn thấy rất nhiều lập trình viên thích viết các biểu thức của họ theo cách này tròn:

if(8 == 4 * 2) { 

Nó chỉ là một sở thích mà một số người nghĩ là rõ ràng hơn.

+0

Đó không phải là một điều kiện, đó là một nhiệm vụ, mà sẽ thất bại;) Chắc chắn bạn chỉ cần đánh máy mặc dù. – Layke

+0

đây là lỗi thời gian biên dịch, bạn không thể chỉ định giá trị cho 8 – knittl

+2

@Layke: đó chính xác là lý do tại sao người ta viết nó theo cách khác: lỗi chính tả biến thành lỗi biên dịch – knittl

6

Đây là chủ yếu để ngăn chặn tai nạn giao:

if (self::$_instance = null) ... //oops! 
4

Không có khác biệt hiệu suất đáng kể. Lợi ích thông thường của việc viết các biểu thức theo cách này là lập trình phòng thủ. Chúng tôi muốn tránh vô tình sử dụng bài tập thay vì so sánh bình đẳng:

if (self::$_instance = null) { ... 

Woops!

+0

Wow, ba câu trả lời đồng thời hầu như giống hệt nhau. Ai đó nợ một Coke. –

3

Nó giúp bạn lấy mã đúng.

Nếu bạn làm điều này, mã của bạn sẽ làm việc, nhưng hiệu quả sẽ là một chặng đường dài từ những gì bạn muốn:

if (self::$instance = null) { 

Các điều kiện sẽ luôn luôn thất bại (vì các nhà điều hành = trả về các thiết lập giá trị, và nó là falsy) nhưng self::$instance bây giờ sẽ được đặt thành null. Đây không phải là những gì bạn muốn.

Nếu bạn làm điều này:

if (null = self::$instance) { 

mã của bạn sẽ thất bại để làm việc, bởi vì bạn không thể sử dụng null (hoặc bất kỳ đen như một chuỗi hoặc một số nguyên) trên bên trái phía của một bài tập. Chỉ các biến có thể là phía bên trái của toán tử =.

Vì vậy, nếu bạn nhập sai ===, bạn sẽ gặp lỗi phân tích cú pháp và mã của bạn hoàn toàn không hoạt động. Điều này là thích hợp hơn với một lỗi bí ẩn và khó theo dõi.

Các vấn đề liên quan