Hướng dẫn dùng expression example trong PHP

Biểu thức (expression) và phép toán (operator) là những khái niệm rất cơ bản không chỉ trong lập trình PHP mà trong gần như tất cả các ngôn ngữ lập trình. Hiểu rõ ràng các đặc thù của phép toán và biểu thức cho phép bạn xây dựng các lệnh tính toán phức tạp bằng ngôn ngữ lập trình.

Nội dung chính

  • Khái niệm biểu thức (expression) và phép toán (operator) trong PHP
  • Toán hạng (operand)
  • Độ ưu tiên của phép toán
  • Tính kết hợp
  • Danh sách phép toán trong PHP
  • Kết luận

Tuy nhiên, vì nhiều lý do, không ít bạn thường bỏ qua các vấn đề cơ bản như toán hạng, toán tử, tính kết hợp, độ ưu tiên. Điều này dẫn đến việc xây dựng những biểu thức lỗi hoặc không theo đúng ý. Ngoài ra các bạn cũng gặp nhiều khó khăn khi tự đọc và tra cứu thông tin về phép toán khi thiếu những kiến thức cơ bản này.

Biểu thức và phép toán trong trong PHP tham khảo rất nhiều của C. Vì vậy, những bạn nào đã học C sẽ thấy rất quen thuộc và dễ dàng tiếp cận.

Khái niệm biểu thức (expression) và phép toán (operator) trong PHP

Biểu thức (expression) trong PHP là những lệnh tính toán sinh ra một giá trị mà bạn có thể gán cho một biến khác. Kết quả tính toán của biểu thức, do đó, có thể được tái sử dụng ở nhiều vị trí trong code.

PHP phân biệt biểu thức với mệnh lệnh (statement) ở chỗ, mệnh lệnh không tạo ra giá trị (mà bạn có thể gán cho một biến khác). Ví dụ, echo 'Hello world'; là một statement do nó không sinh ra bất kỳ giá trị nào có thể tái sử dụng.

Với định nghĩa trên thì một giá trị cụ thể, ví dụ giá trị chuỗi 'Hello world' hay giá trị số 12345, hay một biến được xem là những biểu thức đơn giản nhất.

Các biểu thức phức tạp được tạo ra từ biến, giá trị, và các biểu thức khác thông qua các phép toán (operator).

Trong các bài học trước bạn đã làm quen với nhiều phép toán ứng với mỗi loại dữ liệu:

  • Các kiểu dữ liệu số có các phép toán số học, các phép so sánh, các phép chuyển đổi kiểu, phép tăng giảm, các phép gán.
  • Kiểu dữ liệu chuỗi có phép toán truy xuất phần tử, các phép so sánh, phép toán ghép chuỗi, phép toán ghép-gán.
  • Kiểu dữ liệu boolean có các phép toán logic.

Nhìn chung các phép toán phân biệt nhau bởi số lượng toán hạng (operand), độ ưu tiên (precedence) và tính kết hợp (associativity).

Toán hạng (operand)

Mỗi phép toán cần sử dụng một lượng ‘giá trị’ nhất định để hoạt động. Ví dụ, phép cộng cần hoạt động trên hai số. Các giá trị tham gia vào một phép toán được gọi là toán hạng (operand).

Một số phép toán chỉ cần một toán hạng khi hoạt động. Ví dụ, phép toán logic phủ định ! chỉ nhận một giá trị kiểu boolean: $pos = true; $neg = !$pos; Loại phép toán chỉ cần một toán hạng như vậy được gọi là unary operator.

Một số phép toán unary khác bao gồm:

  • các phép toán chuyển đổi kiểu (int), (integer), (bool), (boolean), (float), (double), (string).
  • phép toán đổi dấu - (ví dụ -$a).
  • các phép tăng giảm ++, --
  • các phép gán +=, *=, /=, -=, **=, .=

Chỉ có một phép toán duy nhất trong PHP cần đến 3 toán hạng, gọi là phép toán điều kiện ?(conditional operator). Phép toán cần đến 3 toán hạng được gọi là ternary operator.

Cách sử dụng phép toán điều kiện như sau:

$kết_quả = biểu_thức_logic ? giá_trị_1 : giá_trị_2;

Theo đó, nếu biểu thức logic nhận giá trị true thì kết quả sẽ là giá trị 1, ngược lại kết quả sẽ nhận giá trị 2. Đây là dạng viết ngắn gọn của lệnh rẽ nhánh (bạn sẽ học sau).

Hầu như tất cả các phép toán còn lại trong PHP cần đến hai toán hạng. Loại phép toán này được gọi là binary operator.

Cũng chú ý rằng, một số phép toán làm biến đổi toán hạng. Ví dụ các phép gán +=, -=, *=, /=, .=. Các phép toán này gán giá trị mới ngược trở lại cho toán hạng của nó.

Tuy nhiên, các phép toán còn lại không làm biến đổi giá trị của toán hạng.

Độ ưu tiên của phép toán

Khái niệm độ ưu tiên (precedence) bạn đã biết từ khi học số học ở tiểu học. Quy tắc đơn giản nhất về độ ưu tiên mà bạn nào cũng biết là ‘nhân chia trước, cộng trừ sau’.

Độ ưu tiên là thứ tự thực hiện của phép toán trong trường hợp có nhiều phép toán trong một biểu thức. Ví dụ, trong biểu thức 2 + 4 * 3 thì phép nhân 4 * 3 thực hiện trước, lấy kết quả (12) và thực hiện tiếp phép cộng 2 + 12.

Trong PHP mọi thứ diễn ra đúng như vậy. Mỗi phép toán có một độ ưu tiên xác định. Các phép toán có độ ưu tiên lớn hơn phải thực hiện trước, sau đó mới thực hiện các phép toán có độ ưu tiên thấp hơn.

Lấy ví dụ,

  • phép toán logic or có độ ưu tiên gần như thấp nhất, 2
  • trong khi phép xor có độ ưu tiên 3
  • and có độ ưu tiên 4
  • các phép gán có độ ưu tiên 5
  • các phép + – . có độ ưu tiên 15
  • các phép * / % có độ ưu tiên 16
  • độ ưu tiên cao nhất là phép toán new (tạo object mới – sẽ học trong phần lập trình hướng đối tượng).

Điểm đặc biệt trong PHP là các phép toán logic có hai dạng, dạng ký hiệu &&, || và dạng chữ and, or. Dạng ký hiệu có độ ưu tiên cao hơn dạng chữ: && có độ ưu tiên 8, trong khi and có độ ưu tiên 4, || có độ ưu tiên 7, trong khi or có độ ưu tiên 3. Đây là điều rất cần lưu ý khi xây dựng các biểu thức logic.

Bảng kê chi tiết các phép toán cùng độ ưu tiên sẽ trình bày ở cuối bài học.

Để thay đổi độ ưu tiên khi thực hiện phép toán bạn cần đặt phép toán trong cặp dấu ngoặc tròn (). Ví dụ, trong biểu thức (2 + 4) * 3 thì phép cộng (2 + 4) giờ có độ ưu tiên cao nhất, cho kết quả 6, sau đó mới lấy kết quả này nhân với 3.

Tính kết hợp

Ở trên đã nói đến độ ưu tiên của các phép toán khác nhau trong biểu thức. Tuy nhiên, nếu trong biểu thức có nhiều phép toán với cùng độ ưu tiên thì sẽ thực hiện chúng theo thứ tự nào?

Mỗi phép toán, bên cạnh độ ưu tiên, còn một thông tin nữa gọi là tính kết hợp (associativity). Tính kết hợp quy định thứ tự thực hiện phép toán nếu có nhiều phép toán cùng độ ưu tiên trong biểu thức.

Thực ra điều này bạn cũng đã rất quen thuộc trong số học. Với các phép toán số học, nếu có cùng độ ưu tiên thì các phép toán thực hiện theo thứ tự từ trái qua phải.

Ví dụ, trong biểu thức 2 / 2 * 2, bạn cần thực hiện 2 /2 trước, lấy kết quả (1) thực hiện tiếp phép nhân với 2. Một số bạn quên mất tính chất này, lại đi thực hiện 2 * 2 trước rồi mới thực hiện phép chia 2/4, ra kết quả sai 0.5.

Trong PHP xác định 2 loại kết hợp: kết hợp trái (sang phải), kết hợp phải (sang trái). Ngoài ra còn có một số phép toán không kết hợp.

Phép toán kết hợp trái, thường ký hiệu là L – asscociativity, sẽ thực hiện phép toán cùng mức độ ưu tiên theo thứ tự từ trái qua phải. Đây là dạng kết hợp trong các phép toán số học và logic quen thuộc.

Phép toán kết hợp phải, thường ký hiệu là R – associativity, sẽ thực hiện phép toán cùng mức độ ưu tiên theo thứ tự từ phải qua trái. Đây là tính kết hợp của phép toán phủ định logic !, các phép toán chuyển đổi kiểu, các phép toán tăng giảm.

Phép toán không kết hợp (nonassociative), thường ký hiệu là N, không được phép kết hợp trong một biểu thức.

Ví dụ, bạn không thể tính giá trị của những biểu thức như 1 < 2 > 1. Phép toán so sánh > và < có cùng mức độ ưu tiên (13) nhưng lại không cho phép kết hợp.

Tất cả các phép toán so sánh (<, <=, >, >=, ==, !=, <>, ===, !==) đều không có tính kết hợp.

Danh sách phép toán trong PHP

Khi đã hiểu hết các vấn đề liên quan đến phép toán, bạn có thể đọc hiểu bảng danh sách phép toán trong PHP dưới đây.

Bạn có thể sử dụng bảng danh sách phép toán này để tham khảo khi cần thiết chứ không cần (và không nên) học thuộc.

Chú ý các ký hiệu:

  • P – precedence (độ ưu tiên) của phép toán. P cao hơn thì phép toán được ưu tiên thực hiện trước.
  • A – Associativity (tính kết hợp) của phép toán, trong đó L – kết hợp trái->phải, R – kết hợp phải -> trái, N – không kết hợp.
  • Operation là tên phép toán, chúng tôi giữ nguyên tên tiếng Anh để bạn dễ tra cứu khi cần.

Hướng dẫn dùng expression example trong PHP

Có thể thấy bạn đã quen phần lớn các phép toán trong danh sách này. Một số phép toán còn sót lại sẽ được xem xét trong những bài học riêng.

Kết luận

Trong bài học này chúng ta xem xét tổng hợp về biểu thức (expression) và phép toán (operator) trong PHP.

  • Nhìn chung, biểu thức và phép toán của PHP rất gần với C, vì thực tế chúng được tham khảo từ C.
  • PHP phân biệt biểu thức (expression) và mệnh lệnh (statement), trong đó biểu thức có sinh ra kết quả còn mệnh lệnh thì không.
  • Biểu thức được tạo ra từ các biến/giá trị và phép toán (operator).
  • Phép toán phân chia theo số lượng toán hạng, thành unary, binary và ternary.
  • Phép toán phân chia theo mức độ ưu tiên, theo đó phép toán có độ ưu tiên cao hơn sẽ được thực hiện trước.
  • Phép toán phân chia theo tính kết hợp, với kết hợp trái, kết hợp phải, và không kết hợp.

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