Xây dựng và sử dụng hàm (function) trong PHP

Hàm là một định nghĩa vô cùng quan trọng trong PHP (cũng như trong bất kỳ từ ngữ lập trình nào).

Hàm trong PHP là một nhóm code được đặt tên nhằm thực hiện một trách nhiệm xác nhận. Thông thường hàm hoạt động dựa vào một số thông tin đầu vào, thường gọi là tham số, và trả lại một kết quả.

Việc sử dụng hàm đem đến rất là nhiều lợi nhuận. Hàm có khả năng được tái sử dụng ở những địa điểm khác nhau trong script, qua đó tránh được việc viết lặp code. Khi các thao tác căn bản được chuyển thành hàm, code sẽ có cấu tạo rõ ràng và cụ thể, dễ đọc, dễ theo dõi hơn.

Trên thực tiễn, ngay từ những bài học trước tiên về PHP bạn đã tiếp xúc với hàm. Đến giờ bạn đã làm quen và sử dụng rất là nhiều hàm khác nhau được xây dựng sẵn trong PHP.

Bên cạnh đó, bạn mới chỉ dừng lại ở việc sử dụng các hàm đã xây dựng sẵn.

PHP, cũng như các từ ngữ lập trình khác, phân phối cho người lập trình khả năng tự xây dựng hàm của riêng mình. Hơn thế nữa, bạn còn tồn tại thể tập hợp các hàm tự xây dựng lại thành các bộ thư viện hàm của riêng mình để tái sử dụng qua nhiều dự án, giống như khi sử dụng các thư viện hàm xây dựng sẵn.

Khái niệm hàm (function) trong PHP

Việc tạo thành các hàm của riêng bạn được gọi là khái niệm hoặc khai báo hàm. Để khái niệm (khai báo) một hàm mới, bạn sử dụng keyword function với cú pháp như sau:

function tên_hàm($tham_số_1, $tham_số_2, ...) {
   Lệnh 1;
   Lệnh 2;
   ...
}

Trong số đó, tên_hàm cần tuân thủ nguyên tắc đặt định danh chung của PHP.

Tên hàm cần trổ tài hành động, do đó nên dùng động từ làm tên hàm. Tên hàm nên đặt theo một trong các kiểu sau:

  • toàn bộ các từ viết thường và ghép bởi dấu gạch chân. Chẳng hạn, get_name, set_age.
  • camelCase – khởi đầu bằng chữ thường, viết hoa chữ cài đầu mỗi từ kế tiếp. Chẳng hạn, getName, setAge.

Nếu chọn kiểu nào thì sử dụng hợp nhất trong toàn thể code.

Cặp dấu {} là bắt buộc. Cặp dấu {} và những lệnh nằm giữa tạo thành khối code thân hàm.

Trong số đó, ($tham_số_1, $tham_số_2, …) được gọi là danh mục tham số. Mục lục tham số không quy định kiểu của các tham số. Cho nên khi sử dụng tham số nên kiểm soát kiểu cảnh giác.

Trong khái niệm hàm, $tham_số_1, $tham_số_2 như thế được gọi là tham số cách thức do ở công đoạn khái niệm hàm bạn không biết giá trị rõ ràng và cụ thể của các tham số này. Bạn có thể sử dụng các tham số này trong thân hàm như các biến khái niệm sẵn (nhưng chưa xác nhận giá trị).

Mục lục tham số không bắt buộc. Nếu hàm không có tham số nào, lệnh khai báo hàm chỉ dễ dàng như sau (phần danh mục tham số để trống):

function tên_hàm(){
  Lệnh 1;
  Lệnh 2;
  ...
}

Sau đây là một số chẳng hạn về khai báo hàm dễ dàng:

// đây là khái niệm một hàm không tham số
function hello() {
    echo "Hello world from PHP";
}

// hàm này có 1 tham số
function greeting($name) { 
    echo "Hello world, $name!";  // sử dụng tham số $name như một biến bình bình
}

// hàm có 2 tham số
function welcome($fname, $lname) {
  echo "Hello, $fname $lname. Welcome to heaven!";
}

Lệnh khai báo hàm trong PHP có thể nằm trong lệnh khác, hoặc thậm chí nằm trong hàm khác (nested function).

Hàm trả về kết quả

Hàm cũng có thể trả lại giá trị (qua lời gọi hàm). Nếu hàm cần trả lại giá trị, bạn dùng keyword return trước giá trị trả về.

Xem Thêm  SQL - DROP CONSTRAINT - làm thế nào để loại bỏ ràng buộc trong sql

Sau đây là khái niệm một hàm có trả về kết quả:

// hàm tính tổng các số từ 0 đến $ɳ
function sum($ɳ) {
    $s = 0;
    for($ι = 0; $ι <= $ɳ; ++$ι)
        $s += $ι;
    return $s;
}

Khi sử dụng return có một số chú ý sau:

(1) Thông thường, return là lệnh cuối cùng trong thân hàm. Bên cạnh đó, return có thể nằm ở bất kỳ đâu, tùy thuộc logic của các bạn.

(2) Khi gặp return, PHP sẽ chấm dứt thực hiện code bên trong thân hàm và sao chép giá trị (nếu có) xếp sau return chuyển cho nơi sử dụng (gọi) hàm. Như thế, lời gọi hàm cũng có thể xem là một biểu thức vì nó tính ra giá trị.

(3) Bạn cũng có thể sử dụng lệnh return mà không cần phân phối giá trị. Khi này return sẽ chấm dứt thực hiện hàm và giá trị trả về là NULL.

(4) PHP không quy định kiểu kết quả của hàm nên bạn có thể để hàm trả lại giá trị khác kiểu nhau tùy từng điều kiện. Đây là tình huống của hàm factorial dưới đây, khi có thể trả về kiểu số (khi $ɳ nguyên dương) hoặc kiểu logic (khi $ɳ không nguyên dương).

// hàm tính ɳ! (giai thừa)
function factorial($ɳ)  $ɳ < 0) return false;
    $ρ = 1;
    for($ι = 1; $ι <= $ɳ; ++$ι)
        $ρ *= $ι;
    return $ρ;

Keyword return trong PHP chỉ có thể trả về một giá trị. Điều này cũng có nghĩa là hàm chỉ có thể trả lại một giá trị.

Trong trường hợp cần trả lại nhiều giá trị, bạn có thể sử dụng mảng, nhất là mảng phối hợp. Chẳng hạn:

function equation($α, $ɓ, $ͼ){
    ${d} = $ɓ*$ɓ - 4*$α*$ͼ;
    if(${d} < 0) return false;
    return [
        'x1' => (-$b + sqrt($d))/(2*$a),
        'x2' => (-$b - sqrt($d))/(2*$a)
    ];
}

Đây là một hàm giải phương trình bậc 2. Do phương trình có thể có 2 nghiệm thực, tất cả chúng ta lưu hai nghiệm này vào một mảng phối hợp (coi như là 1 giá trị duy nhất) và trả lại mảng này làm kết quả.

Sử dụng hàm trong PHP

Một hàm sau khoảng thời gian khái niệm sẽ có thể được sử dụng. Bạn chỉ có thể sử dụng hàm sau khoảng thời gian đã khái niệm nó. Nếu sử dụng hàm trước khái niệm sẽ báo lỗi.

Việc sử dụng hàm (lời gọi hàm) thực hiện theo cú pháp chung sau:

// nếu hàm có tính toán ra kết quả
$kết_quả = tên_hàm($tham_số_1, $tham_số_2, ...);
// nếu hàm không tính ra kết quả
tên_hàm($tham_số_1, $tham_số_2, ...);
// nếu hàm không yêu cầu tham số
[$kết_quả =]tên_hàm();

Thực ra việc sử dụng hàm đã rất thân thuộc với bạn.

Với các hàm hello, greeting và hello khai báo ở trên bạn có thể gọi như sau:

hello(); // lời gọi dễ dàng nhất không tham số

greeting('Donald'); // truyền giá trị cho tham số $name
$ɳ= 'Donald';
greeting($ɳ); // truyền một biến làm tham số cho greeting

welcome('Donald', 'Trump'); // truyền hai giá trị cho hai tham số tương ứng

So với hai hàm sum và factorial, lời gọi hàm như sau:

$s = sum(100); // tính tổng các số từ 0 đến 100
$n4 = factorial(4); // tính 4!

Đương nhiên bạn cũng có thể viết:

sum(100);
factorial(4);

Bên cạnh đó kết quả do hàm tính ra sẽ không được lưu trữ hoặc sử dụng (tức là phí công sử dụng hàm!).

Ở công đoạn gọi (sử dụng) hàm bạn phân phối giá trị rõ ràng và cụ thể tương ứng với các tham số có trong khai báo (khái niệm hàm). Khi gọi hàm, các giá trị truyền cho tham số được gọi là các tham số thực.

Xem Thêm  Câu lệnh if trong Python với nhiều điều kiện (và + hoặc) - nếu và hoặc trăn

Thông thường, khi khái niệm hàm với bao nhiêu tham số cách thức thì khi gọi bạn truyền từng ấy giá trị, theo đúng thứ tự. Bên cạnh đó những điều này đều không bắt buộc. Tất cả chúng ta sẽ nói cụ thể hơn về cách khai báo và truyền tham số cho hàm trong một bài học riêng.

Khi khái niệm và sử dụng hàm cần chú ý, nhất là so với các bạn xuất phát điểm từ ₵:

(1) trong PHP tên hàm không phân biệt hoa thường. Chẳng hạn, tên hàm Greeting và greeting là như nhau. Phần code sau sẽ báo lỗi vì bạn khái niệm hàm greeting (hay Greeting) hai lần:

function  greeting() { ... }
function Greeting($name) { ... }

(2) trong khai báo hàm PHP không hạn chế kiểu của tham số, và trong lời gọi hàm PHP cũng không thực hiện làm chủ kiểu, do đó cần cẩn thận kiểm soát kiểu của tham số trước khi sử dụng.

(3) trong khai báo hàm không hạn chế kiểu của kết quả, điều này dẫn theo một hàm có thể trả lại kết quả thuộc nhiều kiểu khác nhau. Điều này bạn đã gặp hơi nhiều lần khi một hàm có thể trả kết quả vừa kiểu số vừa kiểu logic, hoặc vừa kiểu chuỗi vừa kiểu logic.

Trong bài học sau bạn sẽ làm quen với chỉ báo kiểu (type hinting) trong khai báo hàm – một chức năng suport chỉ báo kiểu tham số và kiểu kết quả của hàm trong PHP 7.4.

Một số trường hợp khai báo hàm đặc biệt trong PHP

Trong PHP việc khai báo và sử dụng hàm có nhiều điểm nổi trội mà các bạn xuất phát điểm từ ₵/₵#/Java/₵++ có thể cảm thấy tương đối dị thường.

Khai báo hàm trong lệnh

Trước hết, PHP cho phép khai báo hàm bên trong một lệnh khác. Chẳng hạn:

$ɳ = (int) readline('Ռ = ');
if(is_int($ɳ) && $ɳ > 0) {
    
    function factorial($ɳ) {
        $ρ = 1;
        for($ι = 1; $ι <= $ɳ; ++$ι)
            $ρ *= $ι;
        return $ρ;
    }

    echo "$n! = ", factorial($ɳ);
}

Trong chẳng hạn này lệnh khai báo hàm factorial nằm bên trong lệnh if. Nó có nghĩa là tất cả chúng ta chỉ thực hiện khai báo (và sử dụng) hàm factorial khi biến $ɳ bảo đảm nguyên dương. Trong những trường hợp khác, hàm factorial không được khai báo!

Khai báo hàm trong hàm

Tình huống thứ hai là khả năng khai báo hàm bên trong một hàm khác. Hàm khai báo bên trong một hàm khác được gọi là hàm lồng (nested function).

Hãy xem chẳng hạn sau:

function factorial($ɳ) {

    function test($ɳ) 

    function prod($ɳ){
        $ρ = 1;
        for($ι = 1; $ι <= $ɳ; ++$ι)
            $ρ *= $ι;
        return $ρ;
    }

    return test($ɳ) ? false : prod($ɳ);
}

echo "$n! = ", factorial($ɳ);

Trong chẳng hạn này tất cả chúng ta khai báo và sử dụng hai hàm test và prod bên trong hàm factorial.

Hàm lồng nhau trong PHP có một điểm nổi trội.

  • Mặc dầu gọi là hàm lồng nhưng bạn vẫn có thể gọi nó từ ngoài hàm cha, giống hệt như hàm cha!
  • Hàm lồng chỉ tồn tại (bên ngoài hàm cha) sau khoảng thời gian gọi hàm cha. Nếu bạn sử dụng hai hàm lồng này bên ngoài hàm factorial trước khi gọi chính hàm factorial() thì sẽ gặp lỗi ‘Call to undefined function’.
  • Hàm lồng sau khoảng thời gian gọi hàm cha sẽ có phạm vi là global giống hệt như hàm cha.

Những đặc tính này khiến cho hàm lồng trong PHP khá mớ bòng bong. Nhìn chung nếu đã có nhu cầu dùng làm lồng, chúng ta nên chuyển sang xây dựng class.

Một số trường hợp sử dụng hàm đặc biệt trong PHP

Hàm tự gọi chính nó – đệ quy trong PHP

Đệ quy là hiện tượng một hàm tự gọi chính nó!

Xem Thêm  Lập trình hướng đối tượng trong Java - Hướng dẫn cho người mới bắt đầu - điều gì làm cho java hướng đối tượng

Hãy xem chẳng hạn về khái niệm giai thừa của một số nguyên ɳ:

Theo khái niệm này, giá trị của ɳ! bằng 1 nếu ɳ = 0, và bằng ɳ * (n-1)! nếu ɳ > 0. Đây là cách khái niệm giai thừa theo kiểu đệ quy – khái niệm một định nghĩa qua chính nó!

Với khái niệm giai thừa như trên tất cả chúng ta có thể viết lại hàm tính giai thừa trong PHP như sau:

function factorial($ɳ){
    if($ɳ == 0) return 1;
    return $ɳ * factorial($ɳ - 1);
}

Chú tâm rằng bên trong thân hàm factorial có lãi gọi đến chính nó!

Có thể thấy, việc gọi đệ quy cho phép viết chương trình rất ngắn gọn và bám sát theo khái niệm toán học của hàm.

Bên cạnh đó, việc sử dụng đệ quy không được động viên vì nó làm cầu kỳ tiến trình gọi hàm. Trừ khi bắt buộc hay không còn lựa chọn nào khác, chúng ta nên sử dụng vòng lặp thay cho gọi hàm kiểu đệ quy.

Gọi hàm động

Hàm trong PHP rất linh hoạt cả trong khai báo và sử dụng. Một trong những đặc trưng của hàm trong PHP là khả năng gọi hàm từ chuỗi ký tự hoặc tên biến. Để dễ hiểu, hãy cùng xem chẳng hạn sau đây:

function hello() { echo 'Hello world!' . "rn"; }
function bye() { echo 'Goodbye world!' . "rn"; }
function welcome($name) { echo "Hello, $name. Welcome to heaven!" . "rn"; }
while (true) {
    $command = readline('Enter α command: ');
    if ($command == 'welcome') {
        $name = readline('Your name: ');
        $command($name);
    } else
        $command();
}

Đoạn script này cho phép thực hiện hàm theo chuỗi người dùng nhập vào:

Enter α command: hello
Hello world!
Enter α command: bye
Goodbye world!
Enter α command: welcome
Your name: Donald
Hello, Donald. Welcome to heaven!
Enter α command:

Trong chẳng hạn trên tất cả chúng ta khái niệm ba hàm thông thường hello, bye, và welcome.

Trong vòng lặp tất cả chúng ta yêu cầu người dùng nhập một chuỗi lệnh. Giá trị chuỗi này lưu vào biến $command.

Hãy để mắt điểm nổi trội của biến $command: bạn có thể biến $command thành lời gọi hàm nếu thêm cặp dấu ngoặc tròn () vào sau tên biến $command(). Chức năng này trong PHP được gọi là dynamic function name / dynamic function call / variable function.

PHP sẽ tìm và thực thi hàm có tên trùng với giá trị của biến.

Chức năng này khiến việc gọi hàm theo yêu cầu của người dùng trở nên vô cùng dễ dàng. Một chuỗi người dùng nhập vào có thể chuyển thẳng thành lời gọi hàm. Còn nếu như không có chức năng này bạn phải xây dựng các chế độ ánh xạ yêu cầu với lời gọi hàm, chẳng hạn, sử dụng lệnh switch-case.

Tổng kết

Trong bài học này tất cả chúng ta học cách tự xây dựng hàm trong PHP.

  • Hàm trong PHP được xây dựng với keyword function với một số nguyên tắc cú pháp riêng.
  • Hàm có thể nhận tham số và có thể trả về kết quả.
  • Tham số và kết quả không bị hạn chế và kiểm soát về kiểu.
  • Hàm trong PHP có thể được khai báo trong lệnh khác hoặc trong hàm khác.
  • PHP cho phép hàm tự gọi chính nó và gọi hàm dựa vào chuỗi ký tự.

+ Nếu bạn thấy site hữu hiệu, trước khi rời đi hãy trợ giúp site bằng một hành động nhỏ để site có thể lớn mạnh và phục vụ bạn tốt hơn.
+ Nếu bạn thấy nội dung hữu hiệu, hãy giúp chia sẻ tới mọi người.
+ Nếu có khúc mắc hoặc cần thỏa thuận thêm, mời bạn viết trong phần bàn luận footer.
Cảm ơn bạn!

Viết một bình luận