Tính năng cung cấp gợi ý kiểu đã có trong PHP kể từ phiên bản 5. Type hinting đề cập đến thực tiễn cung cấp kiểu dữ liệu của một tham số trong định nghĩa hàm. Trước PHP 7, chỉ có thể sử dụng mảng, callable và lớp cho gợi ý kiểu trong một hàm. Từ PHP 7 trở đi, bạn cũng có thể chèn gợi ý kiểu cho các tham số của kiểu dữ liệu nguyên thủy như int, string, bool, v.v.
PHP là một ngôn ngữ có kiểu động (và kiểu yếu). Do đó, bạn không cần phải khai báo kiểu của tham số khi định nghĩa một hàm, điều này là cần thiết trong một ngôn ngữ có kiểu tĩnh như C hoặc Java.
Một định nghĩa điển hình về hàm trong PHP như sau −
function addition($x, $y) { echo "First number: $x Second number: $y Addition: " . $x+$y; }
Ở đây, chúng ta giả định rằng các tham số $x và $y là số. Tuy nhiên, ngay cả khi các giá trị được truyền vào hàm không phải là số, trình phân tích cú pháp PHP vẫn cố gắng chuyển đổi các biến thành kiểu tương thích nhất có thể.
Nếu một trong các giá trị được truyền vào là một chuỗi biểu diễn của một số, và giá trị thứ hai là một biến số, PHP sẽ chuyển đổi biến chuỗi thành số để thực hiện phép cộng.
Hãy xem ví dụ sau đây −
<?php function addition($x, $y) { echo "First number: " . $x; echo "\nSecond number: " . $y; echo "\nAddition: " . $x+$y; } $x="10"; $y=20; addition($x, $y); ?>
Nó sẽ tạo ra output −
First number: 10 Second number: 20 Addition: 30
Tuy nhiên, nếu $x trong ví dụ trên là một chuỗi không có đại diện số hợp lệ, một lỗi sẽ xảy ra.
<?php function addition($x, $y) { echo "First number: " . $x; echo "\nSecond number: " . $y; echo "\nAddition: " . $x+$y; } $x="Hello"; $y=20; addition($x, $y); ?>
Chạy đoạn mã này và xem nó hiển thị error .
Một tính năng mới được giới thiệu trong phiên bản PHP 7 cho phép định nghĩa một hàm với các tham số mà kiểu dữ liệu của chúng có thể được chỉ định trong dấu ngoặc đơn.
PHP 7 đã giới thiệu các khai báo kiểu Scalar sau đây −
Int
Float
Bool
String
Interfaces
Mảng
Callable
Các phiên bản cũ của PHP chỉ cho phép sử dụng các kiểu dữ liệu mảng, callable và class làm gợi ý kiểu. Hơn nữa, trong các phiên bản cũ của PHP (PHP 5), lỗi nghiêm trọng thường là lỗi có thể khôi phục, trong khi phiên bản mới (PHP 7) trả về lỗi có thể ném.
Khai báo kiểu vô hướng được thực hiện trong hai chế độ −
Coercive Mode − Coercive là chế độ mặc định và không cần phải chỉ định.
Strict Mode − Chế độ nghiêm ngặt phải được chỉ định rõ ràng.
Hàm addition() được định nghĩa trong ví dụ trước có thể được viết lại bằng cách kết hợp các khai báo kiểu như sau −
function addition(int $x, int $y) { echo "First number: $x Second number: $y Addition: " . $x+$y; }
Lưu ý rằng trình phân tích cú pháp vẫn ép kiểu các loại không tương thích, tức là, chuỗi thành số nguyên nếu chuỗi đó chứa một số nguyên như trước đây.
Hãy xem ví dụ sau đây −
<?php function addition(int $x, int $y) { echo "First number: " . $x; echo "\nSecond number: " . $y; echo "\nAddition: " . $x+$y; } $x="10"; $y=20; echo addition($x, $y); ?>
Nó sẽ tạo ra output −
First number: 10 Second number: 20 Addition: 30
Rõ ràng, điều này là do PHP là một ngôn ngữ kiểu yếu, vì PHP cố gắng ép kiểu một biến kiểu chuỗi thành kiểu số nguyên. PHP 7 đã giới thiệu một tính năng chế độ nghiêm ngặt để giải quyết vấn đề này.
Để chống lại việc kiểm tra kiểu yếu của PHP, một chế độ nghiêm ngặt đã được giới thiệu. Chế độ này được kích hoạt với một declare statement −
declare (strict_types=1);
Bạn nên đặt câu lệnh này ở đầu script PHP (thường là ngay dưới thẻ PHP). Điều này có nghĩa là độ chặt chẽ của kiểu dữ liệu cho các scalar được cấu hình theo từng tệp.
Trong chế độ yếu, cờ strict_types là 0. Việc đặt nó thành 1 buộc trình phân tích cú pháp PHP kiểm tra tính tương thích của các tham số và giá trị được truyền vào. Thêm câu lệnh này vào đoạn mã trên và kiểm tra kết quả. Nó sẽ hiển thị thông báo lỗi sau:
Fatal error: Uncaught TypeError: addition(): Argument #1 ($x) must be of type int, string given, called in add.php on line 12 and defined in add.php:4 Stack trace: #0 add.php(12): addition('10', 20) #1 {main} thrown in add.php on line 4
Dưới đây là một ví dụ khác về khai báo kiểu scalar trong định nghĩa hàm. Chế độ nghiêm ngặt khi được bật sẽ gây ra lỗi nghiêm trọng nếu các kiểu không tương thích được truyền làm tham số.
<?php // Strict mode // declare(strict_types = 1); function sum(int ...$ints) { return array_sum($ints); } print(sum(2, '3', 4.1)); ?>
Bỏ chú thích dòng declare ở đầu đoạn mã này và chạy nó. Bây giờ nó sẽ tạo ra một error .
Fatal error: Uncaught TypeError: sum(): Argument #2 must be of type int, string given, called in add.php on line 9 and defined in add.php:4 Stack trace: #0 add.php(9): sum(2, '3', 4.1) #1 {main} thrown in add.php on line 4
Tính năng gợi ý kiểu (type-hinting) chủ yếu được sử dụng bởi các IDE để gợi ý cho người dùng về các kiểu dữ liệu mong đợi của các tham số được sử dụng trong khai báo hàm. Ảnh chụp màn hình dưới đây cho thấy trình soạn thảo VS Code hiển thị mẫu hàm khi bạn gõ.