Hàm (function) trong PHP

Sức mạnh thực sự của PHP đến từ các hàm; nó có hơn 1000 hàm xây dựng sẵn cho bạn sử dụng.


Người dùng tự định nghĩa hàm

Bên cạnh các hàm xây dựng sẵn, chúng ta có thể tự tạo các hàm dùng cho riêng mình.

  • Hàm là khối lệnh có thể sử dụng nhiều lần trong chương trình (giúp bạn tiết kiệm thời gian gõ code cũng như chỉnh sửa, quản lý lỗi).
  • Hàm không được thực thi ngay lập tức khi trang được tải về.
  • Hàm chỉ được thực thi bằng lời gọi hàm.

Cách tạo một hàm do người dùng tự định nghĩa

Người dùng định nghĩa hàm thông qua từ khóa “function”:

Cú pháp

function ten_ham() {
     code thực thi
}

Chú ý: tên hàm chỉ có thể bắt đầu với ký tự hoặc dấu gạch dưới nhưng không được phép bắt đầu với số (0, 1,..,9). Tên hàm không phân biệt chữ hoa hay chữ thường.

Mẹo: nên đặt tên hàm gợi nhắc đến việc mà nó thực hiện!

Tên hàm là tương đương với cả cách viết hoa và viết thường. Mặc dù vậy bạn vẫn nên thống nhất cách viết.

Trong ví dụ dưới đây, chúng tôi tạo hàm có tên “gui_thong_diep()”. Sau tên hàm là dấu ngoặc nhọn mở ( ) và kết thúc bằng dấu ngoặc đóng ( ). Hàm sẽ gửi ra thông điệp “Chào mừng bạn đến với Freehost Page!”. Để gọi hàm, chỉ cần viết tên của nó ra là được:

Ví dụ:

<?php
function gui_thong_diep() {
    echo "Chào mừng bạn đến với Freehost Page!";
}

gui_thong_diep(); // gọi hàm
?>

Tạo các hàm có đối số

Thông tin có thể gửi tới hàm thông qua các đối số. Đối số nó hao hao giống biến mà bạn đã quen dùng trong PHP.

Đối số nằm trong ngoặc đơn ngay sau tên hàm. Bạn có thể thêm bao nhiêu đối số tùy ý, chỉ việc ngăn cách chúng với nhau bằng dấu phẩy.

Ví dụ dưới đây là hàm được xây dựng với một đối số là ($thu_nhap). Khi hàm thue_thu_nhap() được gọi, nó sẽ gửi thông tin của $thu_nhap đến hàm thue_thu_nhap(), sau đó hàm thue_thu_nhap() xử lý thông tin rồi trả về kết quả.

Ví dụ:

<?php
function thue_thu_nhap($thu_nhap) {
   echo ($thu_nhap * 2)/100;
}

thue_thu_nhap(5000);
?>

Kết quả sẽ là 100.


Ví dụ dưới đây sử dụng hàm có 2 đối số là ($thu_nhap$bao_hiem)

<?php
function thue_thu_nhap($thu_nhap, $bao_hiem) {
    $thue = ($thu_nhap * 2)/100;

echo "Thuế thu nhập: $thue. Bảo hiểm hàng tháng: $bao_hiem";
}

thue_thu_nhap(5000, 200);
?>

Đối số mặc định trong PHP

Ví dụ dưới đây đưa ra cách sử dụng đối số mặc định trong hàm, khi bạn không ghi rõ giá trị của đối số trong lời mời gọi hàm nó sẽ sử dụng đối số mặc định:

Ví dụ:

<?php
function setHeight(int $minheight = 150) {
   echo "Chiều cao là : $minheight <br>";
}

setHeight(170);
setHeight(); // Sẽ sử dụng đối số mặc định là 150
setHeight(180);
setHeight(165);
?>

Hàm PHP – trả về giá trị cụ thể

Để yêu cầu hàm trả về giá trị, chúng ta sử dụng câu lệnh return:

Ví dụ:

<?php
function tinh_tong($x, $y) {
   $z = $x + $y;

return $z;
}

echo "5 + 10 = " . tinh_tong(5, 10) . "<br>";
echo "7 + 13 = " . tinh_tong(7, 13) . "<br>";
echo "2 + 4 = " . tinh_tong(2, 4);
?>

PHP là ngôn ngữ khá lỏng

Trong một số ví dụ trên, cần lưu ý là chúng ta không nói với PHP kiểu dữ liệu của biến là gì.

PHP tự động liên kết kiểu dữ liệu với biến, tùy thuộc vào giá trị của nó thế nào. Vì các kiểu dữ liệu không được đặt một cách chặt chẽ, bạn có thể làm những thứ kiểu như là thêm một chuỗi vào số nguyên mà không gây ra lỗi.

Trong PHP 7, khai báo kiểu đã được thêm vào. Điều này cho phép chúng ta tùy chọn chỉ định một kiểu dữ liệu mong muốn khi khai báo một hàm, và bằng cách thêm khai báo strict, nó sẽ ném ra “Fatal Error” nếu kiểu dữ liệu không khớp.

Trong ví dụ dưới đây, chúng ta gửi cả số và chuỗi tới hàm mà không sử dụng strict:

<?php
function addNumbers(int $a, int $b) {
  return $a + $b;
}
echo addNumbers(5, "5 days");
// Vì strict KHÔNG bật nên "5 days"
 được chuyển thành int(5), và nó sẽ trả về 10
?>

Để chỉ định strict, chúng ta cần thiết lập declare(strict_types=1);

Đây phải là dòng đầu tiên trong file PHP.

Trong ví dụ dưới đây, chúng ta gửi cả số và chuỗi tới hàm, nhưng trường hợp này, chúng ta đã thêm khai báo strict:

<?php declare(strict_types=1); // strict requirement

function addNumbers(int $a, int $b) {
  return $a + $b;
}
echo addNumbers(5, "5 days");
// Vì strict được bật và "5 days" không phải là số, lỗi sẽ xuất hiện
?>