Bạn có thể sử dụng toán tử ternary trong PHP mà không cần câu lệnh 'khác' không? Tôi đã thử nó và đó là lỗi trả về. Tìm kiếm của Google không mang lại bất cứ điều gì, vì vậy tôi nghĩ rằng câu trả lời có lẽ là không. Tôi chỉ muốn kiểm tra lại ở đây. Ví dụ:
if [ isset[$testing] {
$new_variable = $testing;
}
Sẽ chỉ đặt $ new_varable nếu $ kiểm tra tồn tại. Bây giờ tôi có thể làm
$new_variable = [isset[$testing] ? $testing : ""];
Nhưng điều đó trả về một biến số trống cho $ new_varable nếu $ kiểm tra không được đặt. Tôi không muốn một biến trống nếu nó không được đặt, tôi muốn $ new_varable không được tạo.
Tôi đã thử
$new_variable = [isset[$testing] ? $testing];
Và nó trả về lỗi. Tôi cũng đã thử
$new_variable = [isset[$testing] ? $testing : ];
Và nó cũng trả về lỗi. Có cách nào để sử dụng toán tử ternary mà không có tuyên bố đính kèm khác, hay tôi đang mắc kẹt viết nó ra lâu dài?
EDIT: Theo lời khuyên của Rizier123, tôi đã thử đặt phần 'khác' của phương trình thành NULL, nhưng cuối cùng nó vẫn đặt một khóa vào một mảng. Giá trị không có ở đó, nhưng chìa khóa là, làm hỏng kế hoạch của tôi. Vui lòng cho phép tôi giải thích thêm.
Mã sẽ lấy một loạt các biến $ _POST từ một biểu mẫu và sử dụng chúng cho các tham số trong STDClass sau đó được sử dụng cho các cuộc gọi phương thức API. Một số biến biểu mẫu sẽ không tồn tại, vì tất cả chúng đều được áp dụng cho cùng một biến cho cuộc gọi API, nhưng người dùng chỉ có thể chọn một biến. Ví dụ, có thể bạn có thể chọn 3 mục, bất kỳ mục nào bạn chọn sẽ được chuyển cho STDCLASS và 2 mục khác không tồn tại.
Tôi đã thử điều này:
$yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = [isset[$yes_this_test] ? $yes_this_test : NULL];
$list->MaybeSet = [isset[$testing] ? $testing : NULL];
print_r[$list];
Nhưng rõ ràng Maybeset sẽ được đặt thành NULL vì [isset [$ kiểm tra] xuất hiện sau [isset [$ yes_this_test] và nó trả về
stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
Tôi sẽ không biết thứ tự nào các biến $ _POST đang xuất hiện, vì vậy tôi thực sự không thể cấu trúc nó theo cách như vậy để đảm bảo danh sách được xử lý theo đúng thứ tự.
Bây giờ tôi biết tôi có thể làm một cái gì đó như
if [ isset[$yes_this_test ] {
$list->MaybeSet = $yes_this_test;
}
elseif [ isset[$testing] ] {
$list->MaybeSet = $testing;
}
Nhưng tôi đã hy vọng có một tốc ký cho loại logic này, vì tôi phải viết hàng tá trong số này. Có một toán tử tương tự như toán tử ternary được sử dụng cho các câu lệnh if/otherif?
Bạn có thể đã biết một số toán tử so sánh trong PHP. Những thứ như ternary
$new_variable = [isset[$testing] ? $testing];
5, null kết hợp $new_variable = [isset[$testing] ? $testing];
6 và các nhà khai thác tàu vũ trụ $new_variable = [isset[$testing] ? $testing];
7. Nhưng bạn có thực sự biết họ làm việc như thế nào không? Hiểu các nhà khai thác này khiến bạn sử dụng chúng nhiều hơn, dẫn đến một cơ sở mã sạch hơn.Trước khi nhìn vào từng toán tử chuyên sâu, đây là bản tóm tắt về những gì mỗi người trong số họ làm:
- Toán tử ternary được sử dụng để rút ngắn các cấu trúc nếu/khác
- Toán tử kết hợp null được sử dụng để cung cấp các giá trị mặc định thay vì null
- Toán tử tàu vũ trụ được sử dụng để so sánh hai giá trị
# Toán tử Ternary
Toán tử ternary là một tốc ký cho cấu trúc
$new_variable = [isset[$testing] ? $testing];
8. Thay vì viết bài này:if [$condition] {
$result = 'foo'
} else {
$result = 'bar'
}
Bạn có thể viết cái này:
$result = $condition ? 'foo' : 'bar';
Nếu
$new_variable = [isset[$testing] ? $testing];
9 này đánh giá thành $new_variable = [isset[$testing] ? $testing : ];
0, toán hạng bên trái sẽ được gán cho $new_variable = [isset[$testing] ? $testing : ];
1. Nếu điều kiện đánh giá là $new_variable = [isset[$testing] ? $testing : ];
2, độ sáng sẽ được sử dụng.Sự thật thú vị: Tên toán tử Ternary thực sự có nghĩa là "một nhà điều hành hoạt động trên ba toán hạng". Một toán hạng là thuật ngữ được sử dụng để biểu thị các phần cần thiết cho một biểu thức. Toán tử ternary là toán tử duy nhất trong PHP yêu cầu ba toán hạng: điều kiện, kết quả
$new_variable = [isset[$testing] ? $testing : ];
0 và $new_variable = [isset[$testing] ? $testing : ];
2. Tương tự, cũng có các toán tử nhị phân và Unary. Bạn có thể đọc thêm về nó ở đây.Quay lại với các nhà khai thác ternary: Bạn có biết biểu thức nào đánh giá thành
$new_variable = [isset[$testing] ? $testing : ];
0, và cái nào không? Hãy xem cột $new_variable = [isset[$testing] ? $testing : ];
6 của bảng này.Toán tử ternary sẽ sử dụng toán hạng tay trái của mình khi điều kiện đánh giá là
$new_variable = [isset[$testing] ? $testing : ];
0. Đây có thể là một chuỗi, một số nguyên, một boolean, v.v ... Toán tử tay phải được sử dụng cho cái gọi là "giá trị giả".Các ví dụ sẽ là
$new_variable = [isset[$testing] ? $testing : ];
8 hoặc $new_variable = [isset[$testing] ? $testing : ];
9, một mảng hoặc chuỗi trống, $yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = [isset[$yes_this_test] ? $yes_this_test : NULL];
$list->MaybeSet = [isset[$testing] ? $testing : NULL];
print_r[$list];
0, một biến không xác định hoặc không được chỉ định, và tất nhiên là $new_variable = [isset[$testing] ? $testing : ];
2. Tất cả các giá trị này sẽ làm cho nhà điều hành ternary sử dụng toán hạng tay phải của nó.Nhận thấy một tpyo? Bạn có thể gửi PR để sửa nó. Nếu bạn muốn cập nhật những gì đang xảy ra trên blog này, bạn có thể theo dõi tôi trên Twitter hoặc đăng ký nhận bản tin của tôi:
# Nhà điều hành Ternary Shorthand
Kể từ Php 5.3, có thể rời khỏi toán hạng bên trái, cho phép các biểu thức thậm chí ngắn hơn:
$result = $initial ?: 'default';
Trong trường hợp này, giá trị của
$new_variable = [isset[$testing] ? $testing : ];
1 sẽ là giá trị của $yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = [isset[$yes_this_test] ? $yes_this_test : NULL];
$list->MaybeSet = [isset[$testing] ? $testing : NULL];
print_r[$list];
3, trừ khi $yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = [isset[$yes_this_test] ? $yes_this_test : NULL];
$list->MaybeSet = [isset[$testing] ? $testing : NULL];
print_r[$list];
3 đánh giá thành $new_variable = [isset[$testing] ? $testing : ];
2, trong trường hợp đó, chuỗi $yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = [isset[$yes_this_test] ? $yes_this_test : NULL];
$list->MaybeSet = [isset[$testing] ? $testing : NULL];
print_r[$list];
6 được sử dụng.Bạn có thể viết biểu thức này giống như cách sử dụng toán tử ternary bình thường:
$new_variable = [isset[$testing] ? $testing : ""];
0Trớ trêu thay, bằng cách rời khỏi toán hạng thứ hai của toán tử ternary, nó thực sự trở thành một toán tử nhị phân.binary operator.
# Chuỗi các toán tử ternary
Sau đây, mặc dù nó có vẻ hợp lý; Không hoạt động trong PHP:
$new_variable = [isset[$testing] ? $testing : ""];
1Lý do bởi vì là toán tử ternary trong PHP là liên kết trái, và do đó được phân tích cú pháp theo một cách rất lạ. Ví dụ trên sẽ luôn đánh giá phần
$yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = [isset[$yes_this_test] ? $yes_this_test : NULL];
$list->MaybeSet = [isset[$testing] ? $testing : NULL];
print_r[$list];
7 trước tiên, vì vậy ngay cả khi $yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = [isset[$yes_this_test] ? $yes_this_test : NULL];
$list->MaybeSet = [isset[$testing] ? $testing : NULL];
print_r[$list];
8 sẽ là $new_variable = [isset[$testing] ? $testing : ];
0, bạn sẽ không bao giờ thấy đầu ra của nó.Tôi tin rằng điều đúng đắn cần làm là tránh các nhà khai thác ternary lồng nhau. Bạn có thể đọc thêm về hành vi kỳ lạ này trong câu trả lời tràn ngăn xếp này.
Hơn nữa, như Php 7.4, việc sử dụng các ternaring có chuỗi mà không có dấu ngoặc bị phản đối.
# Nhà điều hành Null Coalescing
Bạn đã xem xét các loại bảng so sánh các loại trước đó? Nhà điều hành Null Coalescing có sẵn kể từ Php 7.0. Nó tương tự như toán tử ternary, nhưng sẽ hoạt động như
stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
0 trên toán hạng bên trái thay vì chỉ sử dụng giá trị boolean của nó. Điều này làm cho toán tử này đặc biệt hữu ích cho các mảng và gán mặc định khi một biến không được đặt.$new_variable = [isset[$testing] ? $testing : ""];
2Nhà điều hành Null Coalescing có hai toán hạng, làm cho nó trở thành một nhà điều hành nhị phân. "Nhân tiện, kết hợp", có nghĩa là "kết hợp với nhau để tạo thành một khối hoặc toàn bộ". Nó sẽ mất hai toán hạng và quyết định sử dụng nào dựa trên giá trị của toán hạng bên trái.
# Null kết hợp với mảng
Toán tử này đặc biệt hữu ích khi kết hợp với các mảng, vì các hành vi của nó như
stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
0. Điều này có nghĩa là bạn có thể nhanh chóng kiểm tra sự tồn tại của các khóa, thậm chí các khóa lồng nhau, mà không viết các biểu thức dài dòng.$new_variable = [isset[$testing] ? $testing : ""];
3Ví dụ đầu tiên cũng có thể được viết bằng toán tử ternary:
$new_variable = [isset[$testing] ? $testing : ""];
4Lưu ý rằng không thể sử dụng toán tử ternary tốc ký khi kiểm tra sự tồn tại của các phím mảng. Nó sẽ kích hoạt một lỗi hoặc trả về boolean, thay vì giá trị của toán hạng bên trái thực.
$new_variable = [isset[$testing] ? $testing : ""];
5# Null kết hợp chuỗi
Nhà điều hành Null Coalescing có thể dễ dàng bị xích:
$new_variable = [isset[$testing] ? $testing : ""];
6# Nested Coalescing
Có thể sử dụng toán tử Null Coalescing trên các thuộc tính đối tượng lồng nhau, ngay cả khi một thuộc tính trong chuỗi là
$yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = [isset[$yes_this_test] ? $yes_this_test : NULL];
$list->MaybeSet = [isset[$testing] ? $testing : NULL];
print_r[$list];
0.$new_variable = [isset[$testing] ? $testing : ""];
7# NULL HOẠT ĐỘNG HOẠT ĐỘNG
Trong Php 7,4, chúng ta có thể mong đợi một cú pháp ngắn hơn được gọi là "toán tử phân công liên kết null".
$new_variable = [isset[$testing] ? $testing : ""];
8Trong ví dụ này,
stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
3 sẽ được đặt thành $yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = [isset[$yes_this_test] ? $yes_this_test : NULL];
$list->MaybeSet = [isset[$testing] ? $testing : NULL];
print_r[$list];
6, trừ khi nó được đặt trong mảng được chuyển cho hàm. Điều này sẽ tương đương với những điều sau đây, sử dụng toán tử kết hợp NULL hiện tại:$new_variable = [isset[$testing] ? $testing : ""];
9# Toán tử tàu vũ trụ
Toán tử tàu vũ trụ, trong khi có một cái tên khá đặc biệt, có thể rất hữu ích. Đó là một nhà điều hành được sử dụng để so sánh. Nó sẽ luôn trả về một trong ba giá trị:
$new_variable = [isset[$testing] ? $testing : ];
8, stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
6 hoặc stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
7.$new_variable = [isset[$testing] ? $testing : ];
8 sẽ được trả lại khi cả hai toán hạng đều bằng nhau, stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
7 khi toán hạng bên trái lớn hơn và stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
6 khi toán hạng bên phải lớn hơn. Hãy xem một ví dụ đơn giản:$new_variable = [isset[$testing] ? $testing];
0Ví dụ đơn giản này không phải là tất cả những gì thoát ra, phải không? Tuy nhiên, toán tử tàu vũ trụ có thể so sánh nhiều hơn các giá trị đơn giản!
$new_variable = [isset[$testing] ? $testing];
1Thật kỳ lạ, khi so sánh vỏ chữ, chữ thường được coi là cao nhất. Có một lời giải thích đơn giản mặc dù. So sánh chuỗi được thực hiện bằng cách so sánh ký tự trên mỗi ký tự. Ngay khi một ký tự khác nhau, giá trị ASCII của chúng được so sánh. Bởi vì các chữ cái viết thường xuất hiện sau các chữ hoa trong bảng ASCII, chúng có giá trị cao hơn.
# So sánh các đối tượng
Toán tử tàu vũ trụ gần như có thể so sánh bất cứ điều gì, thậm chí các đối tượng. Cách các đối tượng được so sánh dựa trên loại đối tượng. Các lớp PHP tích hợp có thể xác định so sánh của riêng họ, trong khi các đối tượng Userland được so sánh dựa trên các thuộc tính và giá trị của chúng.
Khi nào bạn muốn so sánh các đối tượng bạn yêu cầu? Vâng, thực sự có một ví dụ rất rõ ràng: ngày tháng.
$new_variable = [isset[$testing] ? $testing];
2Tất nhiên, so sánh ngày chỉ là một ví dụ, nhưng vẫn rất hữu ích.
# Sắp xếp các chức năng
Một cách sử dụng tuyệt vời cho toán tử này, là sắp xếp các mảng. Có khá nhiều cách để sắp xếp một mảng trong PHP và một số phương pháp này cho phép hàm sắp xếp do người dùng xác định. Hàm này phải so sánh hai yếu tố và trả về
stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
7, $new_variable = [isset[$testing] ? $testing : ];
8 hoặc stdClass Object [ [DefinitelySet] => for sure [MaybeSet] => ]
6 dựa trên vị trí của chúng.Một trường hợp sử dụng tuyệt vời cho nhà điều hành tàu vũ trụ!
$new_variable = [isset[$testing] ? $testing];
3Để sắp xếp giảm dần, bạn có thể đơn giản là đảo ngược kết quả so sánh:
$new_variable = [isset[$testing] ? $testing];
4Xin chào, cảm ơn vì đã đọc! Tôi hy vọng bài viết trên blog này đã giúp bạn! Nếu bạn muốn liên hệ với tôi, bạn có thể làm như vậy trên Twitter hoặc qua e-mail. Tôi luôn thích trò chuyện!
Chú thích
Tóm tắt về mảng + mảng trong PHP
Mảng phá hủy trong PHP
Các thuộc tính trong Php 8 - Một cái nhìn cận cảnh về các thuộc tính, còn được gọi là chú thích
Mảng hợp nhất so với + +