- vừa được xem lúc

Phân biệt toán tử ?? và ?: trong PHP

0 0 12

Người đăng: Thanh Sang Cao

Theo Viblo Asia

Giới thiệu

Khi làm việc với các framework PHP, chúng ta thấy xuất hiện các toán tử ?? và ?: được sử dụng rất thường xuyên. Bản thân mình trong quá trình làm việc hay bị nhầm lẫn khi sử dụng chúng. Để có thể sử dụng hiệu quả thì chúng ta hãy cùng tìm hiểu và phân biệt 2 toán tử này nhé

1. Toán tử Elvis ?:

Trước phiên bản 5.3, PHP đã cung cấp cú pháp if else toán tử 3 ngôn ngắn gọn

condition ? true : false;

Kể từ PHP 5.3+, chúng ta có thể sử dụng cú pháp toán tử ternary ngắn hơn bằng cách bỏ phần giữa của toán tử ternary

expr1 ?: expr2;

Để hiểu rõ cách hoạt động thì chúng ta hãy xem cách viết đầy đủ của toán tử này

// Sử dụng toán tử elvis
expr1 ?: expr2; // Sử dụng toán tử ternary
expr1 ? expr1 : expr2; // Sử dụng if else
if (expr1) { return expr1;
} else { return expr2;
}

Cú pháp này dịch ra văn nói sẽ là "nếu điều kiện expr1 là True thì sẽ return expr1, nếu không thì return expr2". Biểu thức bên phải của toán tử Elvis tức toán hạng thứ 2 sẽ chỉ được thực thi nếu toán hạng thứ nhất được đánh giá là False.

Chúng ta cần phải ghi nhớ thế nào được coi là False trong PHP:

  • Kiểu Boolean: false
  • Kiểu Integer: 0
  • Kiểu Float: 0.0
  • Kiểu String: '0', "0"
  • String rỗng: '', ""
  • Mảng rỗng: [] hoặc array()
  • NULL
  • SimpleXML objects được tạo từ các thẻ trống

Lưu ý: Các chuỗi dạng "00", "0.0", "\0", và "false" đều được coi là TRUE, chúng khác với string '0' hoặc boolean false.

Chúng ta có thể sử dụng cùng lúc nhiều toán tử Elvis và nó sẽ trả về giá trị TRUE đầu tiên mà nó gặp phải

echo 0 ?: 1 ?: 2 ?: 3; // output: 1

Nếu chỉ dùng if else thì nó sẽ dài dằng dặc như này

if (expr1) { return expr1;
} else if (expr2) { return expr2;
} else if (expr3) { return expr3;
} else { return expr4;
}

Với các ngôn ngữ khác:

Trong một số ngôn ngữ lập trình khác như Perl, Python, Ruby và JavaScript, toán tử elvis được viết dưới dạng toán tử OR (ký hiệu ||). Điều này có hành vi tương tự, tức là trả về toán hạng đầu tiên của nó nếu nó được đánh giá là TRUE hoặc đánh giá và trả về toán hạng thứ hai của nó theo cách khác.

2. Toán tử hợp nhất NULL ??

Từ PHP 7, toán tử hợp nhất NULL được giới thiệu và có cú pháp như sau

expr1 ?? expr2;

Nó có nghĩa là expr1 được trả về nếu expr1 tồn tại và không NULL, mặt khác biểu thức sẽ trả về expr2.

Nếu không sử dụng cú pháp ?? thì biểu thức trên sẽ được biểu diễn như này

// Sử dụng if else
if (isset($x)) { return $x;
} else { return $y;
} // Sử dụng toán tử ternary để biểu diễn
return isset($x) ? $x : $y; 

Lưu ý: Toán tử này chỉ quan tâm 2 điều biến có tồn tại và không NULL còn lại nếu biến được gán boolean FALSE thì cũng được coi là TRUE.

Tương tự với toán tử Elvis, ta có thể sử dụng nhiều ?? cùng lúc

$x ?? $y ?? $z ?? 'empty'; // output: 'empty'

Trong trường hợp không có giá trị được xác định trong chuỗi liên kết, thông báo "Notice: Undefined variable: ..." được hiển thị.

3. So sánh ?: vs ??

Chúng ta sẽ làm 1 bảng so sánh 2 toán tử này với 1 biểu thức đã cho để thấy rõ sự khác biệt của chúng

Expression echo ($x ?: 'hello') echo ($x ?? 'hello')
$x = ""; 'hello' ""
$x = null; 'hello' 'hello'
$x; 'hello'
(and Notice: Undefined variable: x)
'hello'
$x = []; 'hello' []
$x = ['a', 'b']; ['a', 'b'] ['a', 'b']
$x = false; 'hello' false
$x = true; true true
$x = 1; 1 1
$x = 0; 'hello' 0
$x = -1; -1 -1
$x = '1'; '1' '1'
$x = '0'; 'hello' '0'
$x = '-1'; '-1' '-1'
$x = 'random'; 'random' 'random'
$x = new stdClass; object(stdClass) object(stdClass)

Tổng kết

Trên đây mình đã trình bày về 2 toán tử thường xuyên sử dụng trong PHP hy vọng sẽ giúp ích cho các bạn trong quá trình làm việc. Cảm ơn các bạn đã đọc bài. Nếu có sai sót hãy góp ý cho mình nhé 😉

Nguồn:

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 525

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 396

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 738

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 358

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 449

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 433