Bài 15: Tìm hiểu về Function (Hàm) trong PHP

“Hãy hòa nhã với những kẻ dở hơi. Ai biết được ngày sau bạn có thể phải làm việc cho một kẻ như vậy.”

Bill Gates

Microsoft

Trong bài học này bạn sẽ được học về cách tạo các function (hàm) tùy chỉnh trong PHP. Cách định nghĩa function và một số vấn đề liên quan với function.

Trong PHP thì vẫn có những function đã được dựng sẵn (built-in functions). Bạn cũng có thể gọi trực tiếp nó ra để thực thi những tác vụ cụ thể

Ví dụ như: gettype()print_r()var_dump

Bạn có thể xem thêm những hàm đã được dựng sẵn trong PHP tại đây.

1. Ưu điểm khi sử dụng Function (Hàm) do User tự định nghĩa trong PHP

Ngoài các hàm dựng sẵn (built-in function), PHP cũng cho phép bạn định nghĩa (define) các function (hàm) của riêng mình.

Đó là một cách để tạo các đoạn code có thể tái sử dụng để thực hiện các tác vụ cụ thể và có thể được giữ và duy trì độc lập với chương trình chính.

Dưới đây là một số lợi thế của việc sử dụng các hàm:

1.1. Các hàm làm giảm sự lặp lại code trong một chương trình

Hàm cho phép bạn trích xuất khối mã thường được sử dụng thành một single component.

Bây giờ bạn có thể thực hiện cùng một tác vụ bằng cách gọi hàm này bất cứ nơi nào bạn muốn trong tập lệnh của mình mà không phải sao chép và viết lại cùng một khối lệnh nhiều lần.

1.2. Hàm làm cho mã dễ bảo trì hơn nhiều

Vì một hàm được tạo một lần có thể được sử dụng nhiều lần, do đó, mọi thay đổi được thực hiện bên trong hàm sẽ tự động được điều chỉnh tại tất cả các vị trí mà không cần tìm đến từng vị trí một.

1.3. Các hàm giúp dễ dàng loại bỏ các lỗi hơn

Khi chương trình được chia thành các hàm, nếu có lỗi xảy ra, bạn biết chính xác hàm nào gây ra Bug (lỗi) và tìm nó ở đâu.

=> Do đó, Debug (sửa lỗi) trở nên dễ dàng hơn nhiều.

1.4. Các hàm có thể được sử dụng lại trong ứng dụng khác

Vì một hàm được tách ra khỏi phần còn lại của tập lệnh, nên dễ dàng sử dụng lại hàm tương tự trong các ứng dụng khác chỉ bằng cách include tệp php chứa các hàm đó.

Phần sau đây sẽ cho bạn thấy bạn có thể dễ dàng định nghĩa Function của mình như thế nào trong PHP.

2. Cách tạo và gọi hàm trong PHP (Creat and invoking function in PHP)

Cú pháp cơ bản của việc tạo một hàm tùy chỉnh như sau:

function functionName(){
    // Code to be executed
}

Việc khai báo một hàm do chúng ta tự định nghĩa bắt đầu bằng từ function, theo sau là tên của hàm bạn muốn tạo.

Tiếp theo nữa là dấu ngoặc đơn (), và và cuối cùng đặt mã thực thi của hàm của bạn vào giữa các dấu ngoặc nhọn {}.

Đây là một ví dụ đơn giản về chức năng do người dùng xác định, hiển thị ngày hôm nay:

<?php
// Defining function
function whatIsToday(){
    echo "Today is " . date('l', mktime());
}
// Calling function
whatIsToday();
?>

TIP: Tên hàm phải bắt đầu bằng một chữ cái hoặc ký tự gạch dưới không được bắt đầu bằng một số, theo sau là nhiều chữ cái, số hoặc ký tự gạch dưới tùy ý. Tên hàm không phân biệt chữ hoa chữ thường.

3. Tìm hiểu về tham số của hàm trong PHP

Bạn có thể chỉ định tham số khi bạn định nghĩa hàm của mình để chấp nhận giá trị đầu vào trong thời gian chạy.

Các tham số hoạt động như các biến giữ chỗ trong một hàm.

Chúng được thay thế vào bằng các giá trị (được gọi là đối số) được cung cấp cho hàm tại thời điểm gọi hàm.

function myFunc($oneParameter, $anotherParameter){
    // Code to be executed
}

Bạn có thể định nghĩa bao nhiêu tham số tùy thích.

Tuy nhiên, đối với mỗi tham số bạn chỉ định, một đối số tương ứng cần được truyền cho hàm khi nó được gọi.

Hàm getSum() trong ví dụ sau lấy hai giá trị nguyên làm đối số, chỉ cần cộng chúng lại với nhau và sau đó hiển thị kết quả trong trình duyệt.

<?php
// Defining function
function getSum($num1, $num2){
  $sum = $num1 + $num2;
  echo "Sum of the two numbers $num1 and $num2 is : $sum";
}
 
// Calling function
getSum(10, 20);
?>

Đầu ra của đoạn mã trên sẽ là:

Sum of the two numbers 10 and 20 is : 30

TIP: Đối số là một giá trị mà bạn truyền cho hàm và tham số là biến trong hàm nhận đối số. Tuy nhiên, trong sử dụng phổ biến, các thuật ngữ này có thể hoán đổi cho nhau, tức là một đối số là một tham số là một đối số.

Thực chất chúng nó là 1, chỉ là thời điểm truyền vào khác nhau. Ngắn gọn: Tham số là biến giữ chỗ đợi giá trị của đối số truyền vào lúc gọi.

4. Cách tạo truyền giá trị mặc định cho tham số khi tạo hàm trong PHP

Trong khi tạo hàm trong PHP, bạn không chỉ có thể truyền tham số mà có có thể đặt giá trị mặc định cho tham số đó.

VD:

<?php
// Defining function
function customFont($font, $size=1.5){
    echo "<p style=\"font-family: $font; font-size: {$size}em;\">Hello, world!</p>";
}
 
// Calling function
customFont("Arial", 2);
customFont("Times", 3);
customFont("Courier");
?>

Như bạn có thể thấy, khi gọi customFont() mà không truyền vào giá trị cho đối số thứ 2. Lúc này PHP Engine sẽ sử dụng giá trị mặc định cho tham số $size là 1,5 để thực thi.

5. Cách trả về các giá trị từ một hàm

Một hàm có thể trả về một giá trị cho tập lệnh được gọi là hàm sử dụng câu lệnh return. Giá trị trả về có thể thuộc bất kỳ loại nào, bao gồm mảng (array) và đối tượng (object).

Ta cùng xem ví dụ sau:

<?php
// Defining function
function getSum($num1, $num2){
    $total = $num1 + $num2;
    return $total;
}
 
// Printing returned value
echo getSum(5, 10); // Outputs: 15
?>

Một hàm không thể trả về nhiều giá trị. Tuy nhiên, bạn có thể thu được kết quả tương tự bằng cách trả về một mảng, như được minh họa trong ví dụ sau.

<?php
// Defining function
function divideNumbers($dividend, $divisor){
    $quotient = $dividend / $divisor;
    $array = array($dividend, $divisor, $quotient);
    return $array;
}
 
// Assign variables as if they were an array
list($dividend, $divisor, $quotient) = divideNumbers(10, 2);
echo $dividend;  // Outputs: 10
echo $divisor;   // Outputs: 2
echo $quotient;  // Outputs: 5
?>

Như bạn thấy, cách trả về một mảng cũng khá là đơn giản phải không?

6. Cách truyền đối số cho hàm theo tham chiếu trong PHP

Trong PHP có hai cách bạn có thể truyền đối số cho hàm:

  • theo value (giá trị)
  • và theo reference (tham chiếu).

Theo mặc định, các argument (đối số) hàm được truyền theo value để nếu giá trị của đối số trong hàm bị thay đổi, nó không bị ảnh hưởng bên ngoài hàm.

Tuy nhiên, để cho phép một hàm sửa đổi các đối số của nó, chúng phải được truyền bằng reference (tham chiếu).

Truyền đối số bằng tham chiếu được thực hiện bằng cách thêm dấu và (&) vào tên đối số trong khi định nghĩa hàm, như trong ví dụ dưới đây:

<?php
/* Defining a function that multiply a number
by itself and return the new value */
function selfMultiply(&$number){
    $number *= $number;
    return $number;
}
 
$mynum = 5;
echo $mynum; // Outputs: 5
 
selfMultiply($mynum);
echo $mynum; // Outputs: 25
?>

Bạn có thể thấy, khi định nghĩa hàm selfMultiply thì ta truyền tham số $number. Nhưng vì chúng ta muốn sửa đổi đối số khi truyền vào (bằng cách sử dụng tham chiếu) thì….

Khi tạo hàm chúng ta phải truyền tham số là &$number.

7. Tìm hiểu về phạm vi biến (Variable Scope) trong Lập trình PHP

Trong lập trình PHP bạn có thể khai báo các biến ở bất cứ đâu trong tập lệnh PHP.

Nhưng, vị trí của khai báo xác định mức độ hiển thị của một biến trong chương trình PHP, tức là vị trí khai báo của biến sẽ ảnh hưởng đến việc nơi biến có thể được sử dụng hoặc truy cập.

Khả năng tiếp cận này được gọi là phạm vi biến (Variable Scope)

Theo mặc định, các biến được khai báo trong một hàm là biến cục bộ và chúng không thể được xem hoặc thao tác từ bên ngoài hàm đó, như được minh họa trong ví dụ dưới đây:

<?php
// Defining function
function test(){
    $greet = "Hello World!";
    echo $greet;
}
 
test(); // Outputs: Hello World!
 
echo $greet; // Generate undefined variable error
?>

Tương tự, nếu bạn cố gắng truy cập hoặc nhập một biến được tạo ở bên ngoài vào bên trong hàm, bạn sẽ gặp một lỗi biến không xác định (Generate undefined variable error), như trong ví dụ sau:

<?php
$greet = "Hello World!";
 
// Defining function
function test(){
    echo $greet;
}
 
test();  // Generate undefined variable error
 
echo $greet; // Outputs: Hello World!
?>

Như bạn có thể thấy trong các ví dụ trên:

  • Biến được khai báo bên trong hàm không thể truy cập được từ bên ngoài
  • Tương tự như vậy, biến được khai báo bên ngoài hàm không thể truy cập được bên trong hàm.

Sự tách biệt này làm hạn chế việc các biến trong một hàm bị ảnh hưởng bởi các biến trong chương trình chính.

TIP: Có thể sử dụng lại cùng một tên cho một biến được tạo trong các hàm khác nhau, vì các biến cục bộ chỉ được nhận dạng bởi hàm mà chúng được khai báo.

8. Cách sử dụng global keyword trong lập trình PHP

Trong lập trình, sẽ xảy ra tình huống bạn cần nhập một biến từ chương trình chính vào trong một hàm hoặc ngược lại.

Trong các trường hợp như vậy, bạn có thể sử dụng từ khóa global trước các biến trong hàm.

Từ khóa global biến biến được tạo thành một biến toàn cục, làm cho nó hiển thị hoặc có thể truy cập cả bên trong và bên ngoài hàm, như trong ví dụ dưới đây:

<?php
$greet = "Hello World!";
 
// Defining function
function test(){
    global $greet;
    echo $greet;
}
 
test(); // Outpus: Hello World!
echo $greet; // Outpus: Hello World!
 
// Assign a new value to variable
$greet = "Goodbye";
 
test(); // Outputs: Goodbye
echo $greet; // Outputs: Goodbye
?>

Ở ví dụ trên bạn có thể thấy.

Biến $greet được tạo bên trong hàm test()

Khi khai báo biến $greet thì ta thêm keyword global trước đó như vậy:

global $greet;

Lúc này, biến $greet từ biến cục bộ sẽ biến thành biến toàn cục. Và có thể truy cập ở bên ngoài hàm.

Bạn sẽ được tìm hiểu thêm về khả năng hiển thị (visibility) và kiểm soát truy cập (access control) trong bài học Class và Object trong PHP.

9. Cách tạo hàm đệ quy (Recursive Functions) trong Lập trình PHP

Hàm đệ quy (recursive function) là một hàm tự gọi đi gọi lại cho đến khi một điều kiện được thỏa mãn.

Các hàm đệ quy thường được sử dụng để giải các phép tính toán học phức tạp hoặc xử lý các cấu trúc lồng nhau, ví dụ:

  • In tất cả các phần tử của một mảng được lồng nhau.
<?php
// Defining recursive function
function printValues($arr) {
    global $count;
    global $items;
    
    // Check input is an array
    if(!is_array($arr)){
        die("ERROR: Input is not an array");
    }
    
    /*
    Loop through array, if value is itself an array recursively call the
    function else add the value found to the output items array,
    and increment counter by 1 for each value found
    */
    foreach($arr as $a){
        if(is_array($a)){
            printValues($a);
        } else{
            $items[] = $a;
            $count++;
        }
    }
    
    // Return total count and values found in array
    return array('total' => $count, 'values' => $items);
}
 
// Define nested array
$species = array(
    "birds" => array(
        "Eagle",
        "Parrot",
        "Swan"
    ),
    "mammals" => array(
        "Human",
        "cat" => array(
            "Lion",
            "Tiger",
            "Jaguar"
        ),
        "Elephant",
        "Monkey"
    ),
    "reptiles" => array(
        "snake" => array(
            "Cobra" => array(
                "King Cobra",
                "Egyptian cobra"
            ),
            "Viper",
            "Anaconda"
        ),
        "Crocodile",
        "Dinosaur" => array(
            "T-rex",
            "Alamosaurus"
        )
    )
);
 
// Count and print values in nested array
$result = printValues($species);
echo $result['total'] . ' value(s) found: ';
echo implode(', ', $result['values']);
?>

TIP: Hãy thật cẩn trọng khi tạo các hàm đệ quy, bởi vì nếu mã được viết không đúng, nó có thể dẫn đến một vòng lặp vô hạn của chức năng gọi hàm khiến máy bạn bị đơ.

TỔNG KẾT

Như vậy, qua bài học về hàm (function) này, bạn đã được học về:

  • Cách tạo và gọi hàm trong PHP
  • Cách truyền tham số, đối số vào hàm
  • Cách truyền giá trị mặc định cho tham số
  • Cách truyền đối số cho hàm theo tham chiếu
  • Tìm hiểu về phạm vi của biến (variable scope) trong PHP
  • Cách sử dụng Global keyword
  • Cách tạo hàm đệ quy

Hãy ghi nhớ và làm lại các ví dụ, nếu chắc chắn bạn đã hiểu rõ và không quên các vấn đề liên quan đến hàm trong PHP thì hãy chuyển sang bài tiếp theo.

Có thể bạn muốn xem

Pesudo Element trong CSS

Sử dụng phần tử giả (Pesudo element) trong CSS là một cách để áp dụng các quy tắc CSS cho phần tử không xác định vị trí trong DOM tree.

Pesudo class trong CSS

Bộ chọn lớp giả CSS (Pesudo class Selector) khớp với các thành phần dựa trên một điều kiện bổ sung và không nhất thiết phải được định nghĩa trong DOM tree.

Leave a reply

Please enter your comment!
Please enter your name here