Khái niệm hàm trong PHP

Hàm (function) là một khối chứa các câu lệnh (statement), mục đích là sử dụng khối này nhiều lần trong chương trình. Hàm không thi ngay, mà bạn muốn thi hành hàm ở chỗ nào thì phải gọi hàm theo tên của nó ở chỗ đó. Hàm do bạn tự định nghĩa có dạng như sau:

function functionName() {
    // code thực thi
}

functionName là tên hàm, tên bắt đầu bằng một ký tự hoặc gạch dưới _, nhưng không được bắt đầu bằng số hay ký tự đặc biệt. Tên hàm không phân biệt chữ in hoa - in thường (khác với tên biến trong PHP).

Ví dụ sau tạo một hàm helloWorld(). Ký hiệu { bắt đầu thân hàm.

Để gọi hàm, thật đơn giản viết ra tên hàm: helloWorld

.
function helloWorld() {
    echo "Hello World!";
}

helloWorld(); //gọi hàm

//In ra "Hello World!"

Tham số của hàm

Các dữ liệu chuyển tới cho hàm (truyền cho hàm) thông qua đối số của hàm, chúng có vai trò như là biến. Các đối số được chỉ ra sau tên hàm và nằm trong (), ví dụ hàm sau tính phép nhân của hai số truyền vào hàm.

function nhanHaiso($so1, $so2) {
    $ketqua = $so1 * $so2;
    echo $ketqua;
}
nhanHaiso(2,5);
//kết quả 10

Như ví dụ trên $so1, $so2 là tham số của hàm, bạn muốn có bao nhiêu tham số cũng được - chúng cách nhau bởi dấu ,. Tham số nếu cần kiểm soát kiểu nghiêm ngặt, khi có thể khai báo kiểu dữ liệu cho nó.

function nhanBaiso(float $so1, float $so2, float $so3)
{
    $ketqua = $so1 * $so2 * $so3;
    echo $ketqua;
}
nhanBaiso(2,5,2);
//kết quả 20

Khi định nghĩa một hàm, các biến biểu diễn giá trị sẽ chuyển cho hàm xử lý được gọi là tham số parameter. Khi sử dụng hàm, các giá trị bạn chuyển đến cho hàm gọi là đối số argument.

Tham số mặc định của hàm

Khi khai báo các tham số hàm, bạn có thể gán luôn cho nó một giá trị để khi gọi hàm viết thiếu tham số này thì hàm được truyền giá trị mặc định đó. Các tham số mặc định phải viết sau các tham số không có giá trị mặc định

function setNam(string $name='noname') {
    echo "Name is ".$name;
}
setNam('PHP');  // Name is PHP
setNam();       // Name is noname

Khi bạn sử dụng hàm có tham số mặc định như vậy, bạn nên sắp xếp các tham số mặc định ở phía bên phải.

Giá trị trả về của hàm, mệnh đề return trong hàm

Một hàm có thể trả về một giá trị bằng câu lệnh return $value; với $value là giá trị trả về. Trong hàm nếu gặp lệnh return hàm sẽ dừng thi hành tại đó và gửi giá trị trả về cho nơi gọi hàm.

function phepnhan($num1, $num2) {
    $r = $num1 * $num2;
    return $r;
}

echo phepnhan(3,4);
//Kết quả in ra: 12

Một hàm không có câu lệnh return thì giá trị trả về là NULL, hàm không thể trả về nhiều giá trị, nhưng nếu muốn bạn có thể trả về một mảng. Hàm có mệnh đề return; nhưng không có giá trị thì cũng trả về NULL

Bạn cũng có thể chỉ rõ kiểu trả về của một hàm, với cú pháp:

function functionName() : kiểu_trả_về (void, int, string, array ...)
{
    // code thực thi
}

Truyền tham số dạng tham chiếu cho hàm

Mặc định hàm PHP truyền tham số dạng tham trị (trừ các object), nghĩa là giá trị được sao chép vào tham số. Nếu muốn truyền tham số dạng tham chiếu, tức tên tham số và tên biến truyền vào cùng trỏ tới một khu vực nhớ giá trị, thì tên biến truyền cho hàm cho thêm ký hiệu &

Xem ví dụ sau: Hàm addFive() đơn giản là cộng thêm năm vào giá trị đối số và trả về kết quả.

function addFive($number) {
    $number += 5;
    return $number;
}

// VÍ DỤ KHI TRUYỀN THAM SỐ THAM TRỊ
$a = 10;
echo addFive($a)
echo '<br>';
echo $a;
/*
Kết quả in ra là :
    15  (giá trị hàm trả về, tức là giá trị $number trong hàm)
    10  (giá trị của $a bên ngoài hàm)

==> Khi gọi addFile truyền $a cho nó,
    giá trị của $a được sao chép vào tham số $number của hàm,
    hàm không tác động gì đến $a
*/


// VÍ DỤ KHI TRUYỀN THAM SỐ THAM CHIẾU
echo addFive(&$a)
echo '<br>';
echo $a;
/*
Kết quả in ra là :
    15  (giá trị hàm trả về, tức là giá trị $number cũng chính là biến $a)
    15  (giá trị $a, đi qua hàm bị biến đổi)

==> Khi gọi addFile truyền &$a cho nó,
    thì $number tham chiếu đến chính biến $a (bộ nhớ) chứ không hề sao chép giá trị,
    do vậy các phép gán với $number chính là gán cho $a ở bên ngoài hàm
*/

Gọi hàm động

Động ở đây nghĩa có thể lưu tên hàm như một chuỗi và gọi hàm thông qua chuỗi này. Ví dụ hàm addFivephepnhan ở trên.

//Cách gọi thông thường:
$a = 5;
echo phepnhan(5,6);
echo addFive($a);

//Gọi thông qua một biến lưu tên hàm.
$func1 = 'phepnhan';
$func2 = 'addFive';

echo $func1(5,6);   // <---- Tương đương gọi phepnhan(5,6)
echo $func2($a);    // <---- Tương đương gọi addFive($a)

Kiểu này hay được dùng để xây dựng hàm callback: Xem thêm callback/callable trong PHP

Kiểm tra hàm tồn tại không với function_exists

Hàm function_exists($functionName) trả về true nếu hàm trong chuỗi $functionName có tồn tại trong hệ thống. Bạn sử dụng để kiểm tra sự tồn tại của hàm, trong PHP nhiều hàm dạng nội tại là luôn có sẵn, nhưng cũng có nhiều hàm phụ thuộc vào thành phần mở rộng cài thêm cho PHP. Ví dụ nếu không có hàm opcache_compile_file thì nghĩa là Opache PHP không được kích hoạt.

Danh sách tham số hàm với ký hiệu ...

Bạn có thể khai báo hàm mà tham số nhập vào là tùy ý người dùng khi đó khai báo như sau:

function functionName( ...$thamso)
{
    
}

Nếu vậy bạn có thể gọi hàm:
functionName();
functionName(1,2);
functionName(1,2,3,4,'a','b') ...

Lúc này bên trong hàm có một biến là $thamso đó là biến mảng, chứa các giá trị người dùng truyền vào hàm theo thứ tự

function printNames(...$names)
{
    foreach ($names as $name)
        print($name . '<br>');
}
printNames('Mr A','Mr B', 'Mr C');
/*
Mr A,
Mr B,
Mr C
*/

Ngoài các hàm thông thường, PHP còn có Hàm mũi tên (arrow) và hàm ẩn danh


Đăng ký nhận bài viết mới