Sự khác biệt (nếu có) giữa (null! = $ Object) và ($ object! = Null) khi sử dụng PHP là gì?


8

Tôi đã quen với Java và do đó luôn nghĩ rằng các điều kiện được diễn giải từ trái sang phải, tức là có một sự khác biệt quan trọng trong null != $obj$obj != null

Bây giờ điều này dường như không phải là trường hợp với PHP.

Tôi có thể làm điều gì đó sai trong PHP khi tôi luôn bắt đầu bằng nullphía bên trái không? Tôi có thể giữ hành vi của mình khỏi Java hay tôi cần phải tự rèn luyện bản thân để làm việc khác khi xử lý các điều kiện PHP?


5
Không có sự khác biệt, nhưng bạn nên tránh các điều kiện yoda , thật kỳ lạ khi bạn nghĩ rằng chúng là tiêu chuẩn trong Java hoặc có bất kỳ điểm nào trong chúng, giải thích khôn ngoan.
yannis

Nhưng woulndt đó là một đối số cho luôn luôn bắt đầu với null? Nguyên nhân null = $ a làm cho PHP bị sặc khi mà $ a = null sẽ không bị phát hiện.
sư công nghệ

null = $alà sự phân công và null != $alà so sánh, ý bạn là null == $agì? null = $asẽ không hoạt động và có trong thứ tự giải nghĩa theo thứ tự là rất quan trọng - và nó cũng không hoạt động trong Java. Chúng ta đang nói chuyện có điều kiện hoặc phân công?
yannis

haha ... aehm ... ok. Xin lỗi tôi đã không làm cho mình đủ rõ ràng ..... Hãy giả sử rằng bạn đã viết sai một điều kiện và tạo một biểu thức yoda. (như bạn đã nói) Và bạn tạo ra một dòng mã như: ($ a = null). Nó sẽ đi qua không được chú ý khiến bạn tạo ra một điều kiện pháp lý. Bây giờ nếu tôi nói với nhóm của mình LUÔN LUÔN bắt đầu một điều kiện bằng null (nếu sử dụng kiểm tra null) trên BÊN TAY TRÁI TAY, nó có thể giúp tránh loại lỗi này. Thật ra ... tôi vừa trả lời câu hỏi của mình nhờ phản hồi của bạn. :-)
Wizard Of Tech

1
Nó khác với Java như thế nào?
phant0m

Câu trả lời:


4
  • Không có sự khác biệt (kỹ thuật) - theo kiến ​​thức của tôi cũng không có.
  • Trong PHP, không sử dụng một trong hai.

Tôi khuyên bạn luôn luôn sử dụng các toán tử so sánh nghiêm ngặt ===!==nếu có thể. Bạn sẽ biết khi nào bạn thực sự cần các toán tử so sánh lỏng lẻo.

Hiểu lầm

Tôi tin rằng bạn có thể nhầm lẫn về một vài điều:

  • khai thác ngắn mạch
  • thứ tự đánh giá
  • ưu tiên điều hành

Tôi chỉ thấy rằng hướng dẫn PHP nói: "PHP kiểm tra từng điều kiện theo thứ tự từ trái sang phải"

Không,

  • PHP thủ nào không nói rằng, đó là một nhận xét.
  • PHP không làm điều đó.

PHP đánh giá các điều kiện từ trái sang phải, nhưng nó dừng lại khi biết kết quả:

expr1 && expr2

Nếu expr1đánh giá false, expr2sẽ không được đánh giá. Điều này được gọi là ngắn mạch và dường nhưkhông được ghi chép rõ ràng - tôi không thể tìm thấy bất kỳ lưu ý chính thức nào khác về vấn đề này ngoại trừ nhận xét trong Ví dụ # 1. Đó là một tính năng nổi tiếng , mặc dù.

Ngụy biện

Tôi đã quen với Java và do đó luôn nghĩ rằng các điều kiện được diễn giải từ trái sang phải, tức là có một sự khác biệt quan trọng trong null! = $ Obj và $ obj! = Null


PHP kiểm tra từng điều kiện theo thứ tự từ trái sang phải
Ergo: Có thể áp dụng "cách thực hành tốt nhất" tương tự

Ergo: không có gì - không sequitur. Kết luận không theo từ tiền đề. Sử dụng constant == $variablehoặc $variable == constantkhông được kết nối với một trong hai ngắn mạch , thứ tự đánh giá hoặc ưu tiên vận hành .

Hành vi không xác định

Cả hai toán hạng của !=được luôn được đánh giá. Trong trường hợp của PHP, thứ tự đánh giá (không liên quan ở đây) thực sự không được chỉ định (như không có trong tài liệu).


Thx cho bạn làm rõ về chủ đề này. Mặc dù tôi không thích bạn nói về Kiến thức Java của tôi. (Xem Phần 15.7 của Đặc tả ngôn ngữ Java) Cho phép tổng hợp nó. Thứ tự đánh giá là không xác định trong PHP và do đó bạn không thể dựa vào nó! Thứ 2 không bao giờ sử dụng! = Hoặc == user === hoặc! ==.
sư công nghệ

@anann Tôi không chắc bạn nghĩ tôi đang "đánh giá" kiến ​​thức Java của mình ở đâu. Điều duy nhất tôi đã nói là: "nor is there in Java to my knowledge."Tôi đã đọc phần 15.7, nhưng nó không quan trọng ở đây . Miễn là bạn không có tác dụng phụ trong so sánh của bạn (như trong ví dụ của bạn), thứ tự đánh giá không thành vấn đề. Phần nào bạn thấy là xúc phạm?
phant0m

0

Về trường hợp cụ thể của bạn, một cách tiếp cận khác sẽ là sử dụng hàm php tích hợp is_null. Vì vậy, bạn sẽ kết thúc với is_null ($ hỗn hợp) sẽ làm tất cả công việc cho bạn và thực hiện đúng so sánh kiểu và mọi thứ khác.


-1

@ phant0m: Đã lấy điểm OK ... KHÔNG BAO GIỜ SỬ DỤNG! = hoặc == luôn luôn sử dụng! === và === khi bạn viết mã bằng PHP. Do đó, câu hỏi này đã sai ngay từ đầu và không có cách thực hành tốt nhất nào với NULL ở cả hai phía của điều kiện khi nói đến PHP.


5
Đó là một sự đánh đổi. Bạn hy sinh khả năng đọc để đảm bảo an toàn ( $a == NULLmã hóa ý định, NULL == $athêm biện pháp bảo vệ) và sự an toàn này thậm chí không mạnh vì bạn vẫn dựa vào công việc thủ công (thói quen) thay vì kiểm tra tự động không thể thực hiện được. Tôi không nghĩ rằng sự đánh đổi là xứng đáng, nhưng đó là vấn đề quan điểm cá nhân.
tdammers

1
Ồ, và tôi luôn giả sử 'điều kiện yoda' đề cập đến việc đảo ngược đối tượng và đối tượng trong điều kiện của bạn, để họ đọc "nếu hai mươi ba quả táo bạn có" ( 23 == num_apples) thay vì "nếu bạn có hai mươi ba quả táo" ( num_apples == 23) .
tdammers

2
Bạn dường như bối rối về "tuyên bố Yoda" là gì. Đó là "Yoda" khi bạn đặt NULL (hoặc phần không đổi của biểu thức) ở bên trái: gordienoye.ca/2012/02/07/when-yoda-writes-if-statements
Martin York

2
Ngoài ra php sẽ cảnh báo bạn nếu bạn làm điều này: stackoverflow.com/q/718415/14065 bạn nên kiểm tra nhật ký lỗi của mình để cảnh báo và sửa lỗi và sửa tất cả. Phong cách Yoda là tất cả các cơn thịnh nộ trong những năm 90. Yêu cầu là nó đã giải quyết nhóm vấn đề này. Trong thực tế, nó làm cho mã khó đọc hơn và trình biên dịch (thông dịch viên) cho hầu hết các ngôn ngữ đã cảnh báo bạn về vấn đề này. Vì vậy, không có lợi ích thực sự khi sử dụng chúng (giả sử bạn đảm bảo mã của mình chạy cảnh báo miễn phí (dù sao bạn cũng nên làm như vậy)). Một giải pháp tốt hơn là không thực hiện chuyển nhượng trong các điều kiện (do đó chạy cảnh báo miễn phí).
Martin York

@tdammers Khả năng đọc là ý kiến, vì vậy đối với những người trong chúng ta không có vấn đề gì với họ, "yoda-điều kiện" là những gì chúng ta có xu hướng mặc định. Mắt tôi bị hút vào điều kiện đầu tiên, vì vậy trật tự không giúp ích hay làm hại. Ngay cả đối với ><, tôi sẽ đọc nó nhiều hơn như "Nếu cái đó lớn hơn", thì hãy đọc cái nào lớn hơn để điều kiện vượt qua, thì phía bên kia.
Izkata
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.