Sử dụng toán tử ternary của PHP chỉ với hai đối số


9

Gần đây tôi đã xem xét một số mã của mình và nhận thấy rằng trong tình trạng đãng trí, tôi đã để lại một cấu trúc như sau:

$guid = empty($subscription->guid) ?  : $subscription->guid;

Bây giờ, điều này không làm đúngsai , nhưng vì thuộc tính đó luôn được đặt nên hiện tại nó hoạt động tốt và không có lỗi cú pháp kể từ 5.3 vì thay đổi sau :

Kể từ PHP 5.3, có thể loại bỏ phần giữa của toán tử ternary. Biểu thức expr1 ?: Expr3 trả về expr1 nếu expr1 ước lượng thành TRUE và expr3 nếu không.

Tôi đã không nhận thức được sự thay đổi này và bây giờ tôi tò mò liệu tôi có nên sử dụng nó hay không. Đây là thứ tôi vô cùng thiếu từ các ngôn ngữ như ruby ​​nơi bạn có thể làm, ví dụ, a = b || cđể có được bhoặc chơn là một boolean 'thực'. Tuy nhiên, cú pháp họ đã chọn cho toán tử ternary có vẻ hơi trái ngược với tôi. Tôi có nên sử dụng điều này trong mã sản xuất? Nó chắc chắn đã ném mình khi tôi nhìn thấy nó một cách tình cờ.


Bạn nên sử dụng toán tử hợp nhất null cho Varsolp techflirt.com/null-coalescing-operator-php
Ankur Kumar Singh

Câu trả lời:


7

Toán tử điều kiện ternary không có đối số thứ hai là một tiểu thuyết nhỏ, nhưng nó tương tự 1 với toán tử hợp nhất null được tìm thấy trong các ngôn ngữ phái sinh Algol khác như C # và Perl, và như bạn đề cập, ||toán tử trong Ruby (và JavaScript).

Thoạt nhìn có vẻ kỳ lạ, nhưng nó không quá nổi bật (đặc biệt là vì đã có tiền lệ cho các nhà khai thác tương tự trong các ngôn ngữ khác) và có thể tiết kiệm rất nhiều tổ hợp phím. Và, nếu những gì xảy ra với dấu phân cách không gian tên ( \) là bất kỳ dấu hiệu nào, thì các cú pháp kỳ lạ cuối cùng sẽ được cộng đồng PHP chấp nhận.

Nhưng một trong những vấn đề chính mà các ứng dụng PHP có xu hướng phải đối mặt là (đôi khi) thời gian trễ quá lớn giữa việc phát hành phiên bản PHP mới và khi các máy chủ bắt đầu hỗ trợ nó. Điều này dẫn đến các vấn đề mà bạn cần phải tương thích ngược với các phiên bản PHP cũ hơn, từ bỏ việc sử dụng các thay đổi tiện lợi như thế này.

Nếu điều đó không liên quan đến bạn và nhóm của bạn đồng ý với cách sử dụng của nó (hoặc nếu bạn là nhà phát triển solo, nếu bạn cảm thấy thoải mái với nó), thì bằng mọi cách hãy làm điều đó. Giống như dấu phân cách không gian tên, tôi thực sự nghĩ rằng nó thực sự sẽ là vấn đề khi nào, chứ không phải, nó sẽ được chấp nhận trong tất cả các dự án PHP trong tương lai.


Lưu ý 1 : Nhưng không giống hệt nhau, các toán tử hợp nhất null chỉ kiểm tra các giá trị không null (và không phải giá trị trung thực như PHP) và ?:cú pháp không loại bỏ các thông báo không xác định như bạn đã đề cập trong các nhận xét .


Hiện tại, 'đội' của tôi hoàn toàn là tôi. Lưu trữ không phải là vấn đề vì chúng tôi thường lưu trữ 98% các trang web chúng tôi xây dựng và chúng tôi lưu trữ trên đầu trang 5.3.6. Tôi nhận ra rằng chức năng tự nó không quá bất thường, chỉ là cú pháp cho nó là gốc rễ của câu hỏi của tôi. Ngoài ra còn có vấn đề trong đó nó không hoạt động như một toán tử hợp nhất null mà không cần thêm cú pháp ( @để ẩn các thông báo về những thứ không xác định).
Matthew Scharley

3
@MatthewScharley Nếu sự cố phân định không gian tên (\) là bất kỳ dấu hiệu nào, cú pháp lạ không phải là rào cản đối với việc áp dụng rộng rãi trong PHP. Nó thực sự đi xuống khi nào, không, nếu bạn nên bắt đầu sử dụng nó.

3

Đối với tôi, đó có vẻ như là một lỗi trong mã. Có vẻ như sai và nói chung, tôi tránh sử dụng cú pháp có vẻ như bạn đã mắc lỗi vì lưu một vài lần nhấn phím. Khi bạn (hoặc ai đó) quay lại để đọc mã sau, tôi nghĩ rằng dòng đó sẽ khiến bạn gặp khó khăn và khiến bạn phải dành thời gian để phân tích cú pháp nó đang làm gì, về cơ bản là một thao tác đơn giản.


Ví dụ đưa ra là sai . Việc sử dụng đúng chức năng như dự định sẽ $foo = @$bar ?: 'baz'tương đương với $foo = (@$bar ? $bar : 'baz'). Tôi đồng ý với ý kiến ​​của bạn mặc dù.
Matthew Scharley

1

Chà, PHP có kiểu boolean và ||toán tử trả về boolen, vì vậy trong PHP kết quả $a || $blà boolean, điều này phù hợp với &&việc &&nó trả về cái này hoặc cái kia có ý nghĩa nhưng trả về true/ false. Có tất cả các toán tử boolean trả về bool nghe cũng khá logic.

Ngoài ra, đây không phải là phát minh từ PHP mà theo C, nơi có nhiều yếu tố thiết kế của PHP "cổ điển" đến từ. Trích dẫn từ §6.5,14 của tiêu chuẩn C99:

| | toán tử sẽ mang lại 1 nếu một trong hai toán hạng của nó so sánh không bằng 0; mặt khác, nó mang lại 0. Kết quả có kiểu int.

Và, tốt, bạn nên sử dụng cái gì ?: Hoặc không thể được trả lời ở dạng chung, nhưng hãy nhớ: Cách tốt nhất cho ngôn ngữ là sử dụng các cấu trúc mà nó cung cấp và sử dụng các mô hình mà nó gợi ý. Có rất ít ý nghĩa trong việc viết mã Java như mã C hoặc ngược lại ;-)


0

Tôi nghĩ rằng nó là một toán tử rất hữu ích và chắc chắn nên được sử dụng vì tiêu chuẩn ngôn ngữ xác định rõ ràng nó.

Lưu ý rằng nó chính thức được gọi là Toán tử Elvis trong Grooy (tại sao? Chỉ cần nhìn kỹ vào nó!) Và đã được đề xuất để giới thiệu trong Java 7.

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.