Hướng dẫn php ternary operator without else - toán tử bậc ba php mà không có khác

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 : ""];
0

Trớ 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 : ""];
1

Lý 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 : ""];
2

Nhà đ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 : ""];
3

Ví dụ đầu tiên cũng có thể được viết bằng toán tử ternary:

$new_variable = [isset[$testing] ? $testing : ""];
4

Lư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 : ""];
8

Trong 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];
0

Ví 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];
1

Thậ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];
2

Tấ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];
4

Xin 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 + +

Tôi có thể sử dụng nếu không có trong PHP?

Một tuyên bố nếu bản thân của nó là hoàn toàn tốt. Nếu bạn có một loạt các điều kiện trong đó chỉ có một điều kiện sẽ đúng, tốt hơn là đặt các điều kiện nhất trước đó, thì hãy sử dụng khác nếu trên các điều kiện tiếp theo để PHP không phải tiếp tục đánh giá từng điều kiện.. If you have a series of conditions where only one will be true it's better to put the most likely first, then use else if on the subsequent ones so that PHP doesn't have to keep evaluating each condition.

Tôi có thể sử dụng toán tử ternary trong PHP không?

Thuật ngữ "toán tử ternary" đề cập đến một toán tử hoạt động trên ba toán hạng.Một toán hạng là một khái niệm đề cập đến các phần của một biểu thức mà nó cần.Toán tử ternary trong PHP là người duy nhất cần ba toán hạng: một điều kiện, kết quả đúng và kết quả sai.The ternary operator in PHP is the only one that needs three operands: a condition, a true result, and a false result.

Tại sao sử dụng ternary thay vì nếu

Nhà điều hành ternary tốc ký trông ngắn gọn và ngắn hơn so với câu lệnh nếu/khác thông thường.looks way more concise and shorter than a regular if/else statement.

Null Ternary Toán tử PHP có phải là PHP không?

Trong Php 7, một tính năng mới, toán tử Null Coalescing [??] đã được giới thiệu.Nó được sử dụng để thay thế hoạt động ternary kết hợp với hàm isset [].Nhà điều hành NULL kết hợp lại trở lại toán hạng đầu tiên của mình nếu nó tồn tại và không phải là NULL;Nếu không, nó trả lại toán hạng thứ hai của nó.It is used to replace the ternary operation in conjunction with isset[] function. The Null coalescing operator returns its first operand if it exists and is not NULL; otherwise it returns its second operand.

Bài Viết Liên Quan

Chủ Đề