Phiên bản PHP 7 mở rộng tính năng khai báo kiểu số đến giá trị trả về của một hàm. Theo quy định mới này, khai báo kiểu trả về xác định loại giá trị mà một hàm nên trả về. Chúng ta có thể khai báo các loại sau cho kiểu trả về −
int
float
bool
chuỗi
interfaces
mảng
callable
Để triển khai khai báo kiểu trả về, một hàm được định nghĩa như sau −
function myfunction(type $par1, type $param2): type { # function body return $val; }
Trình phân tích cú pháp PHP sử dụng kiểu ép buộc theo mặc định. Bạn cần khai báo "strict_types=1" để thực thi việc xác minh chặt chẽ hơn về kiểu của biến được trả về so với kiểu được sử dụng trong định nghĩa.
Trong ví dụ sau, hàm division() được định nghĩa với kiểu trả về là int.
<?php function division(int $x, int $y): int { $z = $x/$y; return $z; } $x=20.5; $y=10; echo "First number: " . $x; echo "\nSecond number: " . $y; echo "\nDivision: " . division($x, $y); ?>
Vì việc kiểm tra kiểu dữ liệu chưa được đặt thành strict_types=1, phép chia sẽ diễn ra ngay cả khi một trong các tham số không phải là số nguyên.
First number: 20.5 Second number: 10 Division: 2
Tuy nhiên, ngay khi bạn thêm khai báo strict_types ở đầu kịch bản, chương trình sẽ hiển thị thông báo lỗi nghiêm trọng.
Fatal error: Uncaught TypeError: division(): Argument #1 ($x) must be of type int, float given, called in div.php on line 12 and defined in div.php:3 Stack trace: #0 div.php(12): division(20.5, 10) #1 {main} thrown in div.php on line 3
VS Code cảnh báo về lỗi ngay cả trước khi chạy mã bằng cách hiển thị các dòng lỗi tại vị trí có lỗi.
Để làm cho hàm division() trả về kiểu float thay vì int, hãy chuyển đổi tử số thành float, và xem cách PHP báo lỗi nghiêm trọng.
<?php // declare(strict_types=1); function division(int $x, int $y): int { $z = (float)$x/$y; return $z; } $x=20; $y=10; echo "First number: " . $x; echo "\nSecond number: " . $y; echo "\nDivision: " . division($x, $y); ?>
Bỏ chú thích câu lệnh declare ở đầu và chạy mã này ở đây để kiểm tra đầu ra của nó. Nó sẽ hiển thị một lỗi −
First number: 20 Second number: 10PHP Fatal error: Uncaught TypeError: division(): Return value must be of type int, float returned in /home/cg/root/14246/main.php:5 Stack trace: #0 /home/cg/root/14246/main.php(13): division() #1 {main} thrown in /home/cg/root/14246/main.php on line 5