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

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 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.

Bài 14: Cách sử dụng vòng lặp (loop) trong PHP

Trong bài học này, bạn sẽ học cách sử dụng vòng lặp while, do…while, for, foreach để lặp lại một loạt các hành động trong PHP.

Trong bài học này, bạn sẽ học cách sử dụng vòng lặp while, do…while, for, foreach để lặp lại một loạt các hành động trong PHP.

1. Các kiểu vòng lặp trong PHP

Các vòng lặp được sử dụng để thực thi cùng một khối mã nhiều lần, cho đến khi một điều kiện nhất định được đáp ứng.

Ý tưởng cơ bản đằng sau một vòng lặp là tự động hóa các nhiệm vụ lặp đi lặp lại trong một chương trình để tiết kiệm thời gian và công sức và tối ưu hơn.

Trong PHP hỗ trợ bốn loại vòng lặp khác nhau:

  • while – khi ABC (điều kiện) vẫn còn đúng thì thực hiện công việc XYZ
  • do…while – Thực hiện XYZ 1 lần rồi sau đó mới kiểm tra ABC. Nếu đúng thì thực hiện XYZ tiếp cho đến khi ABC sai.
  • for – Lặp lại XYZ cho đến khi bộ đếm đạt đến số nhất định.
  • foreach – Lặp qua các phần tử trong mảng

Bạn cũng sẽ học cách lặp qua các giá trị của mảng bằng vòng lặp foreach() ở cuối chương này. Vòng lặp foreach() được sinh ra là để dành cho mảng.

2. Vòng lặp While trong PHP – While loop

Câu lệnh while sẽ lặp qua một khối mã cho nếu điều kiện trong câu lệnh while đánh giá là đúng.

Sytax:

while(condition){
    // Code to be executed
}

Ví dụ bên dưới đây xác định một vòng lặp bắt đầu bằng $i = 1.

Vòng lặp sẽ tiếp tục chạy miễn là $i nhỏ hơn hoặc bằng 3. $i sẽ tăng thêm 1 mỗi lần vòng lặp chạy:

<?php
$i = 1;
while($i <= 3){
    $i++;
    echo "The number is " . $i . "<br>";
}
?>

Kết quả:

The number is 2
The number is 3
The number is 4

3. Vòng lặp do…while trong PHP

Vòng lặp do-while là một biến thể của vòng lặp while, đánh giá điều kiện ở cuối mỗi lần lặp của vòng lặp.

Với vòng lặp do-while, khối mã được thực thi một lần và sau đó điều kiện được xem xét đến, nếu điều kiện là đúng, câu lệnh được lặp lại miễn là điều kiện được chỉ định được đánh giá là đúng.

Syntax:

do{
    // Code to be executed
}
while(condition);

Ví dụ sau định nghĩa một vòng lặp bắt đầu bằng $i = 1.

Sau đó, nó sẽ tăng $i lên 1 và in đầu ra.

Sau đó, điều kiện được xem xét và vòng lặp sẽ tiếp tục chạy miễn là $i nhỏ hơn hoặc bằng 3.

<?php
$i = 1;
do{
    $i++;
    echo "The number is " . $i . "<br>";
}
while($i <= 3);
?>

Kết quả:

The number is 2
The number is 3
The number is 4

Như bạn thấy, với vòng lặp do…while thì lần đầu tiên không cần kiểm tra điều kiện.

Sự khác biệt giữa while và do…while khi lặp

Vòng lặp while khác với vòng lặp do…while như sau:

  • Với vòng lặp while, điều kiện cần đánh giá được kiểm tra ở đầu mỗi lần lặp vòng lặp, do đó, nếu biểu thức điều kiện ước lượng thành false, vòng lặp sẽ không bao giờ được thực thi.
  • Mặt khác, với vòng lặp do-while, vòng lặp sẽ luôn được thực thi một lần, ngay cả khi biểu thức điều kiện là sai, bởi vì điều kiện được ước tính ở cuối vòng lặp thay vì bắt đầu.

4. Vòng lặp for() trong PHP – For loop

Vòng lặp for lặp lại một khối mã cho đến khi một điều kiện nhất định được đáp ứng. Nó thường được sử dụng để thực thi một khối mã trong một số lần nhất định.

Syntax:

for(initialization; condition; increment){
    // Code to be executed
}

3 tham số của vòng lặp for có nghĩa là:

  • initialization: Được sử dụng để khởi tạo các biến đếm và được đánh giá một lần vô điều kiện trước lần thực hiện đầu tiên của phần thân của vòng lặp
  • condition: Vào đầu mỗi lần lặp, điều kiện được đánh giá. Nếu nó đánh giá là đúng, vòng lặp tiếp tục và các câu lệnh lồng nhau được thực thi. Nếu nó ước tính thành false, việc thực hiện vòng lặp kết thúc.
  • increment: Nó cập nhật bộ đếm vòng lặp với một giá trị mới. Nó được đánh giá vào cuối mỗi lần lặp.

Ví dụ dưới đây định nghĩa một vòng lặp bắt đầu bằng $i = 1. Vòng lặp sẽ tiếp tục cho đến khi $i nhỏ hơn hoặc bằng 3.

Biến $ i sẽ tăng thêm 1 mỗi lần vòng lặp chạy:

<?php
for($i=1; $i<=3; $i++){
    echo "The number is " . $i . "<br>";
}
?>

Kết quả:

The number is 1
The number is 2
The number is 3

5. Vòng lặp foreach() trong PHP – Foreach loop

Vòng lặp foreach được sử dụng để lặp qua các mảng.

Syntax:

foreach($array as $value){
    // Code to be executed
}

Ví dụ sau đây cho thấy một vòng lặp sẽ in các giá trị của mảng đã cho:

<?php
$colors = array("Red", "Green", "Blue");
 
// Loop through colors array
foreach($colors as $value){
    echo $value . "<br>";
}
?>

Kết quả:

Red
Green
Blue

Có thêm một cú pháp của vòng lặp foreach, đó là phần mở rộng của vòng lặp đầu tiên.

foreach($array as $key => $value){
    // Code to be executed
}

Ví dụ:

<?php
$superhero = array(
    "name" => "Peter Parker",
    "email" => "peterparker@mail.com",
    "age" => 18
);
 
// Loop through superhero array
foreach($superhero as $key => $value){
    echo $key . " : " . $value . "<br>";
}
?>

Kết quả:

name : Peter Parker
email : peterparker@mail.com
age : 18

TỔNG KẾT

Như vậy là bạn đã biết cách hoạt động của vòng lặp trong PHP. Cũng đơn giản thôi phải không nào?

Bài tới chúng ta sẽ học về hàm trong PHP. Bắt đầu đến những phần khó hơn. Hãy chăm chỉ ôn tập lại bài đã học bạn nhé.

Bài 11: Cách sử dụng câu lệnh điều khiển Switch…Case trong PHP

Trong bài học này, bạn sẽ tìm hiểu cách sử dụng câu lệnh Swicth…Case để kiểm tra hoặc đánh giá một biểu thức với các giá trị khác nhau trong PHP.

Trong bài học này, bạn sẽ tìm hiểu cách sử dụng câu lệnh Swicth…Case để kiểm tra hoặc đánh giá một biểu thức với các giá trị khác nhau trong PHP.

Sự khác nhau của If…Else và Switch…Case trong PHP

Câu lệnh Switch..Case là một thay thế cho câu lệnh if-elseif-else, nó gần như tương tự nhau.

Câu lệnh Switch…Case kiểm tra một biến đối với một loạt các giá trị cho đến khi tìm thấy khớp, và sau đó thực thi khối mã tương ứng với khớp đó.

switch(n){
    case label1:
        // Code thực thi nếu n=label1
        break;
    case label2:
        // Code thực thi nếu if n=label2
        break;
    ...
    default:
        // Code thực thi nếu n không thuộc tình huống nào đưa ra.
}

Hãy thử xem ví dụ bên dưới, hiển thị một thông báo khác nhau cho mỗi ngày:

<?php
$today = date("D");
switch($today){
    case "Mon":
        echo "Hôm nay là Thứ Hai. Lau dọn Nhà đi.";
        break;
    case "Tue":
        echo "Hôm nay là thứ Ba. Hãy đi siêu thị mua đồ ăn.";
        break;
    case "Wed":
        echo "Hôm nay là thứ Tư. Đi ngủ sớm.";
        break;
    case "Thu":
        echo "Hôm nay là thứ Năm. Rửa xe đi nhé.";
        break;
    case "Fri":
        echo "Hôm nay là thứ Sáu. Nấu một bữa ngon nào!.";
        break;
    case "Sat":
        echo "Hôm nay là thứ Bảy. Hãy xem một bộ phim.";
        break;
    case "Sun":
        echo "Hôm nay là Chủ Nhật. Ra ngoài đi dạo đi.";
        break;
    default:
        echo "Không có thông báo nào cho bạn";
        break;
}
?>

Câu lệnh switch…case khác với câu lệnh if…elseif…else như thế này:

Câu lệnh switch thực thi từng dòng (tức là thực thi từng câu lệnh một) và một khi PHP tìm thấy một câu lệnh tình huống đánh giá là đúng, nó không chỉ thực thi code tương ứng với câu lệnh tình huống đó, mà còn thực thi tất cả các câu lệnh tình huống tiếp theo cho đến hết.

Để ngăn chặn điều này, thêm một câu lệnh break vào cuối mỗi khối trường hợp. Câu lệnh break bảo PHP thoát ra khỏi khối câu lệnh switch…case sau khi nó thực thi đoạn mã có điều kiện đúng đầu tiên.