PHP được coi là một ngôn ngữ kiểu yếu. Trong PHP, bạn không cần phải khai báo kiểu của một biến trước khi gán cho nó bất kỳ giá trị nào. Trình phân tích cú pháp PHP cố gắng chuyển đổi các biến thành kiểu tương thích càng nhiều càng tốt.
Ví dụ, nếu một trong các giá trị được truyền là một chuỗi đại diện cho 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 xét ví dụ sau −
<?php function addition($x, $y) { echo "First number: $x Second number: $y Addition: " . $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 chứa một đại diện số hợp lệ, thì bạn sẽ gặp phải một lỗi.
<?php function addition($x, $y) { echo "First number: $x Second number: $y Addition: " . $x+$y; } $x="Hello"; $y=20; addition($x, $y); ?>
Nó sẽ tạo ra output −
PHP Fatal error: Uncaught TypeError: Unsupported operand types: string + int in hello.php:5
Type-hinting được hỗ trợ từ phiên bản PHP 5.6 trở đi. Điều này có nghĩa là bạn có thể chỉ định rõ ràng kiểu dữ liệu mong đợi của một biến được khai báo trong mã của bạn. PHP cho phép bạn type-hint các đối số của hàm, giá trị trả về và thuộc tính của lớp. Với điều này, bạn có thể viết mã mạnh mẽ hơn.
Hãy để chúng ta áp dụng kiểu gợi ý (type-hinting) trong hàm cộng (addition function) trong chương trình trên −
function addition(int $x, int $y) { echo "First number: $x Second number: $y Addition: " . $x+$y; }
Lưu ý rằng việc chỉ sử dụng các kiểu dữ liệu trong khai báo biến không ngăn chặn ngoại lệ kiểu không khớp được nêu ra, vì PHP là một ngôn ngữ kiểu động. Nói cách khác, $x="10" và $y=20 vẫn sẽ dẫn đến phép cộng là 30, trong khi $x="Hello" sẽ khiến trình phân tích cú pháp phát sinh lỗi.
<?php function addition($x, $y) { echo "First number: $x \n"; echo "Second number: $y \n"; echo "Addition: " . $x+$y . "\n\n"; } $x=10; $y=20; addition($x, $y); $x="10"; $y=20; addition($x, $y); $x="Hello"; $y=20; addition($x, $y); ?>
Nó sẽ tạo ra output −
First number: 10 Second number: 20 Addition: 30 First number: 10 Second number: 20 Addition: 30 First number: Hello Second number: 20 PHP Fatal error: Uncaught TypeError: Unsupported operand types: string + int in hello.php:5
PHP có thể được cấu hình để áp đặt các quy tắc nghiêm ngặt hơn cho việc chuyển đổi kiểu dữ liệu, để "10" không bị chuyển đổi ngầm định thành 10. Điều này có thể được thực thi bằng cách đặt chỉ thị strict_types thành 1 trong một câu lệnh declare().
Câu lệnh declare() phải là câu lệnh đầu tiên trong mã PHP, ngay sau thẻ "<?php".
Hãy xem xét ví dụ sau −
<?php declare (strict_types=1); function addition(int $x, int $y) { echo "First number: $x Second number: $y Addition: " . $x+$y; } $x=10; $y=20; addition($x, $y); ?>
Nó sẽ tạo ra output −
First number: 10 Second number: 20 Addition: 30
Bây giờ, nếu $x được đặt thành "10", việc chuyển đổi ngầm sẽ không diễn ra, dẫn đến error sau đây −
PHP Fatal error: Uncaught TypeError: addition(): Argument #1 ($x) must be of type int, string given
Từ PHP 7 trở đi, hỗ trợ gợi ý kiểu đã được mở rộng cho các giá trị trả về của hàm để ngăn chặn các giá trị trả về không mong muốn. Bạn có thể gợi ý kiểu cho các giá trị trả về bằng cách thêm kiểu mong muốn sau danh sách tham số, được đặt trước bởi ký hiệu hai chấm (:).
Hãy thêm một gợi ý kiểu cho giá trị trả về của hàm division() dưới đây.
<?php declare (strict_types=1); function division(int $x, int $y) : int { return $x/$y; } $x=10; $y=20; $result = division($x, $y); echo "First number: $x Second number: $y Addition: " . $result; ?>
Bởi vì hàm trả về 0.5, điều này không thuộc loại int (tức là, loại gợi ý được sử dụng cho giá trị trả về của hàm), thông báo sau error sẽ được hiển thị −
Fatal error: Uncaught TypeError: division(): Return value must be of type int, float returned in hello.php:5