Bài 04: Tính năng mới khi xây dựng hàm trong PHP7

PHP7 đã cung cấp thêm một số tính năng mới cho việc xây dựng hàm rất giống với ngôn ngữ C, C++ hay C# đó là ta có thể ràng buộc kiểu dữ liệu của các tham số trong hàm, xác định kiểu giá trị trả về của hàm.

Trước khi vào bài học thì mình đưa ra danh sách các kiểu dữ liệu thông dụng trong PHP7 đã nhé.

1. Danh sách các kiểu dữ liệu trong PHP7

Trong PHP7 chúng ta có một số kiểu dữ liệu như sau:

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable
  • Object (tự định nghĩa)

2. Xác định kiêu dữ liệu của tham số

Nếu bạn đã từng học qua các ngôn ngữ khác như Pascal, C, C++, C# thì bạn sẽ thấy khi chúng ta khai báo biến thì bắt buộc phải xác định luôn kiểu dữ liệu cho biến, điều này trong PHP là không cần thiết bơi cú pháp của nó chỉ cần khai báo tên biến kiểu dữ liệu của biến sẽ phụ thuộc vào giá trị mà ta gán cho nó.

// $a là kiểu INT
$a = 12;

// $b là kiểu string
$b = '12';

Điều này cho thấy PHP là một ngôn ngữ hơi nhẹ dạ trong việc ràng buộc kiểu dữ liệu nên rất tiện lợi khi ta xây dựng ứng dụng web, tuy nhiên cũng có nhiều người cho rằng nó sẽ không có đầy đủ tính chất của một ngôn ngữ lập trình, dễ gây ra nhầm lẫn, nhất là khi sử dụng hàm. Tuy nhiên bây giờ PHP7 đã bổ sung phần khai báo kiểu dữ liệu cho tham số truyền vào nên đây có thể coi là một bước nhay rất hay của PHP7.

Ví dụ:

function showInfomation(string $author, int $year){
   echo 'Tên tác giả là: ' . $author . '<br/>';
   echo 'Tác giả sinh năm: ' . $year . '<br/>';
}

showInfomation('Nguyễn Văn Cường', 1990);

Chạy lên bạn sẽ thấy xuất hiện một thông báo như sau:

Tên tác giả là: Nguyễn Văn Cường
Tác giả sinh năm: 1990

Nhưng nếu bạn bật chế độ Strict Mode và nhập dữ liệu vào như ví dụ dưới đây thì sẽ bị thông báo lỗi.

declare(strict_types=1);

function showInfomation(string $author, int $year){
   echo 'Tên tác giả là: ' . $author . '<br/>';
   echo 'Tác giả sinh năm: ' . $year . '<br/>';
}

showInfomation('Nguyễn Văn Cường', '1990');

Kết quả:

Fatal error: Uncaught TypeError: Argument 2 passed to showInfomation() must be of the type integer, string given, called in 
D:\xampp\htdocs\freetuts\php7.php on line 10 and defined in D:\xampp\htdocs\freetuts\php7.php:4 Stack trace: #0 
#D:\xampp\htdocs\freetuts\php7.php(10): showInfomation('Nguy\xE1\xBB\x85n V\xC4\x83n C...', '1990') #1 {main} thrown in 
#D:\xampp\htdocs\freetuts\php7.php on line 4

2. Xác định kiểu dữ liệu trả về cho hàm

Khi xây dựng hàm thì chúng ta có hai loại hàm chính đó là hàm có giá trị trả về và hàm không có giá trị trả về. Hàm có giá trị trả về làm hàm có sử dụng lệnh return để trả về một giá trị nào đó, còn hàm không có giá trị trả về thì không có sử dụng lênh return nên nó sẽ trả về một giá trị NULL. Trong C, C++ nếu bạn đã khai báo một hàm là hàm có giá trị trả về thì bắt buộc bạn phải sử dụng lệnh return, vậy trong PHP7 như thế nào thì chúng ta cùng tìm hiểu nhé.

Trong PHP7 để xác định kiểu giá trị trả về cho hàm thì ta sử dụng cú pháp sau:

function functionName ($variable) : return_type {
    
}

Trong đó return_type chính là kiểu dữ liệu trả về và nó nằm một trong các kiểu dữ liệu mà mình đã liệt kê ở phần 1.

Ví dụ:

function summary(int $a, int $b) : int {
    return $a + $b;
}

echo summary(2, 3);

Kết quả sẽ in ra con số 5. Tuy nhiên nếu bạn bật chế độ Strict Mode và truyền vào là hai chuỗi thay vì 2 số thì lập tức sẽ bị lỗi ngay.

declare(strict_types = 1);

function summary(int $a, int $b) : int {
    return $a + $b;
}

echo summary('2', '3');

Kết quả:

Fatal error: Uncaught TypeError: Argument 1 passed to summary() must be of the type integer, string given, called in D:\xampp\htdocs\freetuts\php7.php on line 10 and defined in 
D:\xampp\htdocs\freetuts\php7.php:6 Stack trace: #0 D:\xampp\htdocs\freetuts\php7.php(10): summary('2', '3') #1 {main} thrown in D:\xampp\htdocs\freetuts\php7.php on line 6

Lý do nó báo lỗi là do bạn truyền vào là hai chuỗi nên phép $a + $b sẽ trả về một chuỗi chứ không phải là trả về một con số nữa.

3. Lời kết

Cá nhân mình thấy đây là sự thay đổi rất hay và rất thực tế, phù hợp với nhu cầu ràng buộc của các công cụ lập trình. Bài này mình xin dừng tại đây, hẹn gặp lại các bạn ở bài tiếp theo.

Hãy để lại link bài viết gốc khi chia sẻ bài viết này, mình sẽ report DMCA với những website lấy nội dung mà không để nguồn hoặc copy bài với số lượng lớn.

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Group Facebook để được hỗ trợ nhanh nhất.