Kiểu dữ liệu logic boolean (bool) trong PHP

    0

    Kiểu logic là kiểu dữ liệu chỉ chứa giá trị đúng và sai. Trong PHP, kiểu logic có tên gọi bool hoặc boolean tùy tình huống sử dụng. Kiểu bool trong PHP là kết quả thực hiện các phép toán so sánh, các phép toán logic, cũng như một số hàm.

    Kiểu logic trong PHP

    Kiểu logic là kiểu dữ liệu chỉ chứa hai giá trị: true và false.

    Kiểu logic trong PHP có hai tên gọi: bool và boolean. Tên gọi bool dùng trong chỉ báo kiểu của hàm. Tên gọi boolean được dùng trong giá trị trả về của hàm gettype(). Trong phép toán chuyển đổi kiểu có thể sử dụng cả (bool) và (boolean).

    Giá trị true và false không phân biệt hoa/thường. Nghĩa là bạn viết true/TRUE/True hay false/FALSE/False đều được.

    Trong các lệnh xuất dữ liệu với kiểu logic, giá trị true được biểu diễn là 1, còn giá trị false được biểu diễn là một xâu rỗng.

    php > $a = true;
    php > $b = True;
    php > $c = TRUE;
    php > echo $a, ' ', $b, ' ', $c;
    1 1 1
    php > $d = false;
    php > echo $d;
    php >
    

    PHP thực hiện tự động chuyển đổi từ các giá trị khác về boolean như sau:

    • Số nguyên khác 0 chuyển thành true; Số 0 chuyển thành false.
    • Số thực bằng 0.0 chuyển thành false, còn lại là true.
    • Mọi chuỗi không rỗng chuyển thành true; Chuỗi rỗng “” hoặc ” chuyển thành false.
    • Giá trị NULL tương đương với false.
    • Mảng không có phần tử nào tương đương với false.
    • Một object rỗng (không có giá trị hoặc phương thức nào) tương đương với false.

    Với quy tắc chuyển đổi như trên, bạn có thể trực tiếp sử dụng các giá trị khác kiểu bool trong biểu thức logic (ví dụ, cho vòng lặp và cấu trúc rẽ nhánh). Đây là điều gần giống trong C/C++ nhưng xa lạ hơn với C#.

    Để kiểm tra giá trị của một biến có phải kiểu bool/boolean hay không có thể sử dụng hàm is_bool($var).

    Để chuyển đổi các kiểu dữ liệu khác về bool/boolean có thể sử dụng các phép chuyển đổi kiểu (type casting) như (bool), (boolean) hoặc sử dụng hàm chuyển đổi boolval($var).

    Kiểu boolean là kết quả trả về của các phép toán so sánh của các kiểu số và string mà bạn đã học: so sánh số với số, so sánh chuỗi với chuỗi.

    Bạn cũng đã gặp một loạt hàm trả giá trị kiểu boolean:

    • Các hàm kiểm tra kiểu: is_int(), is_double(), is_float(), is_bool(), is_string().
    • Hàm kiểm tra sự tồn tại của biến: isset().

    Nếu cần tạo ra biểu thức logic phức tạp hơn, PHP cung cấp các phép toán logic.

    Các phép toán logic

    Đối với dữ liệu kiểu bool, PHP định nghĩa sẵn các phép toán riêng biệt, gọi là các phép toán logic. Các phép toán logic cho phép ghép nối các giá trị logic thành những biểu thức phức tạp.

    Giống như trong toán học, PHP định nghĩa sẵn các phép toán logic sau:

    Phép logic and cho kết quả true khi và chỉ khi cả hai toán hạng có giá trị true. Trong PHP, phép toán logic and được biểu diễn bằng cụm ký tự && hoặc từ khóa and. Ví dụ:

    php> $a = true;
    php> $b = false;
    php> $c = $a && $b; // cho false
    php> $d = $a and $b; // cho false

    Từ khóa trong PHP không phân biệt hoa/thường.

    Phép toán logic and trong PHP có đặc điểm: nếu biểu thức bên trái phép toán có giá trị false, PHP sẽ không tính toán biểu thức bên phải dấu phép toán nữa (vì kết quả chắc chắn là false). Đặc điểm này của phép toán and được gọi là tính đoản mạch (short-circuit).

    Đặc điểm này tạo ra một kỹ thuật đặc biệt trong PHP, gọi là kỹ thuật đoản mạch (short-circuiting).

    Ví dụ lệnh $result = $flag and mysql_connect(); vận dụng kỹ thuật này để kiểm soát việc kết nối cơ sở dữ liệu. Nếu $flag là false thì lệnh kết nối (tiêu tốn nhiều tài nguyên) sẽ không được thực hiện nữa. Kỹ thuật đoản mạch này giúp viết lệnh ngắn gọn không cần đến cấu trúc lặp.

    Phép toán logic or cho kết quả false chỉ khi cả hai toán hạng cùng có giá trị false. Trong PHP, phép toán logic or được biểu diễn bằng cụm || hoặc từ khóa or. Ví dụ:

    php> $a = true;
    php> $b = false;
    php> $c = $a || $b; // cho true
    php> $d = $a or $b; // cho true

    Phép toán logic or cũng có tính đoản mạch: nếu biểu thức ở vế trái là true thì không thực hiện vế phái nữa, đồng thời trả luôn kết quả của cả biểu thức là true.

    Kỹ thuật này có thể sử dụng, ví dụ, trong việc mở file: $result = fopen($filename) or exit();

    Phép toán logic xor trả lại kết quả true nếu chỉ một trong hai toán hạng là true. Phép toán xor còn được gọi là phép or loại trừ. Chỉ khi trạng thái của hai toán hạng khác nhau thì biểu thức nhận giá trị true.

    Trong PHP, phép toán xor được biểu diễn bằng từ khóa xor.

    php> $a = true;
    php> $b = false;
    php> $c = $a xor $b; // true
    

    Phép toán phủ định đảo ngược giá trị của biểu thức logic: true thành false, false thành true. Phép toán phủ định logic trong PHP được biểu diễn bởi ký tự !.

    php> $a = false;
    php> $b = !$a;// thành true
    php> $c = !$b; // thành false

    Các phép toán so sánh, type juggling

    PHP định nghĩa sẵn các phép toán so sánh mà bạn đã gặp:

    Ký hiệu phép toánTên gọi
    >Lớn hơn
    >=Lớn hơn hoặc bằng
    <Nhỏ hơn
    <=Nhỏ hơn hoặc bằng
    <>, !=Khác (not equal)
    ==Bằng (equal)
    ===Tương đồng (identical)
    !=Không tương đồng (not identical)

    Trước hết cần lưu ý: PHP cho phép so sánh các giá trị khác kiểu nhau!

    Cụ thể hơn, các phép so sánh trong PHP chấp nhận toán hạng là số và chuỗi, và hai toán hạng của phép so sánh không cần phải cùng kiểu. Nghĩa là bạn có thể so sánh số với số, chuỗi với chuỗi, chuỗi với số.

    Đây là một điều hơi ‘không bình thường’ nếu bạn đến từ C# hay Java. Bạn có thể hình dung nó cũng giống như so sánh táo với cam.

    Ngoài ra, đối với chuỗi, PHP cũng quan tâm xem chuỗi này chỉ chứa toàn chữ số (numeric string) hay có thể chứa những ký tự khác ngoài số.

    Để thực hiện kiểu so sánh hơi bất thường này, PHP sử dụng một cơ chế đặc biệt: type juggling. Type juggling là quá trình chuyển đổi kiểu tự động phục vụ so sánh.

    Toán hạng 1Toán hạng 2Kiểu chuyển đổi để so sánh
    Số, vd 123456Số, vd 234567Số
    Chuỗi chữ số, vd ‘123456’Chuỗi chữ số, vd ‘234567Số
    Chuỗi chữ số, vd ‘123456’Số, vd 234567Số
    Chuỗi chữ số, vd, ‘123456’Chuỗi hỗn hợp, vd ‘123456abc’Số
    Chuỗi hỗn hợp, vd ‘123456abc’Số, vd 123456Chuỗi
    Chuỗi hỗn hợpChuỗi hỗn hợpChuỗi

    Trong bài học về các kiểu số trong PHP bạn đã biết cách PHP chuyển đổi từ chuỗi về số.

    Cơ chế type juggling được sử dụng trong gần như tất cả các phép toán so sánh, bao gồm cả >, >=, <, <=, ==, != (<>).

    So sánh chuỗi, còn gọi là lexicographical order, là một chủ đề phức tạp. Tập tài liệu này sẽ không giải thích chi tiết. Bạn có thể tự tìm hiểu thêm từ wikipedia: https://en.wikipedia.org/wiki/Lexicographical_order.

    Điểm rất đặc biệt của cơ chế type juggling nằm ở chỗ, nếu bạn so sánh hai chuỗi chỉ chứa toàn chữ số, chúng cùng được biến đổi về kiểu số để so sánh chứ không so trực tiếp hai xâu. Nếu cần thực sự so hai chuỗi (chứa toàn chữ số), bạn nên dùng hàm strcmp().

    Để so sánh nghiêm ngặt cả về kiểu và giá trị, PHP đưa vào hai phép so sánh riêng của mình: phép toán identity === và not identical !==.

    Phép toán == và ===, != và !==

    Qua hai bài học về kiểu số và kiểu string bạn hẳn đã để ý rằng: trong PHP có hai phép toán so sánh bằng, == và ===; hai phép toán so sánh khác, != và !==. Vậy giữa chúng có gì khác nhau?

    Phép so sánh khác <>!= thực tế là cùng một phép toán. Có thể sử dụng lối viết nào cũng được. Tuy nhiên lưu ý tính thống nhất trong cách viết.

    (1) Phép so sánh ==, gọi là so sánh lỏng (loose comparison) hay phép so sánh bằng (equality) thực hiện type juggling trước khi so sánh hai giá trị. Do đó, hai giá trị khác kiểu vẫn có thể cho kết quả true.

    Ví dụ, so sánh số 1000 và chuỗi ‘1000’ sẽ cho kết quả true:

    php> $a = 1000; // đây là một số
    php> $b = '1000'; // đây là một chuỗi
    php> echo $a == $b; // kết quả là 1 (true)
    1

    (2) Phép so sánh ===, gọi là so sánh chặt (strict comparison) hoặc so sánh đồng nhất (identity), không thực hiện type juggling. Do vậy, nếu hai giá trị khác kiểu thì luôn cho kết quả so sánh là false.

    php > $a = 1000;
    php > $b = ‘1000’;
    php > echo $a === $b; // kết quả là false
    php >

    (3) Tương tự như vậy, phép so sánh khác != hoặc <> (còn gọi là phép toán inequality) thực hiện type juggling trước khi so sánh. Trong khi đó phép toán !== (phép toán not identical) không thực hiện type juggling.

    php > $a = 1000;
    php > $b = '1000';
    php > echo $a !== $b;
    1
    php > echo $a != $b;
    php >
    

    Như vậy, hai phép toán identical (===) và not identical (!==) mới thực sự tương đương với các phép toán == và != trong C.

    Kết luận

    Trong bài học này chúng ta đã xem xét chi tiết về kiểu dữ liệu logic bool/boolean trong PHP.

    • Kiểu dữ liệu này chỉ có hai giá trị true và false.
    • PHP tự động chuyển đổi giá trị của các kiểu dữ liệu khác về true hoặc false theo một số quy tắc đơn giản.
    • Boolean trong PHP là kết quả thực hiện các phép so sánh và một số hàm.
    • Có thể sử dụng các phép toán logic and, or, xor, và phủ định trên các giá trị/biểu thức boolean để tạo ra các biểu thức logic phức tạp hơn.
    • Các phép toán so sánh trong PHP hoạt động hơi khác biệt với việc áp dụng type juggling.

    + Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
    + Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
    + Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
    Cảm ơn bạn!

    * Bản quyền bài viết thuộc về Tự học ICT. Đề nghị tôn trọng bản quyền. DMCA.com Protection Status
    Subscribe
    Notify of
    guest
    0 Thảo luận
    Inline Feedbacks
    View all comments