PHP mặc định cho phép truyền string vào chỗ cần int, rồi tự ép kiểu luôn. Nghe tiện nhưng đến lúc debug bug liên quan đến type thì mới biết khổ — lẽ ra nó phải báo lỗi ngay từ đầu.
declare(strict_types=1) làm gì
Thêm dòng này đầu file PHP, PHP sẽ không tự ép kiểu nữa. Hàm cần int mà truyền string vào là throw TypeError luôn.
<?php
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
echo add(2, 3); // 5
echo add('2', 3); // TypeError: Argument 1 passed to add() must be of the type int, string given
Không có strict types thì lời gọi thứ hai sẽ tự convert '2' thành 2, chạy bình thường và bạn chẳng biết có gì sai. Bật strict types thì nó lỗi ngay — đó là điều mình muốn.
Tại sao nên dùng
- Bug hiện ra lúc dev thay vì lúc production.
- Function signature nói int thì là int thật, không đoán mò.
- Dễ bảo trì hơn — biết chính xác type nào chạy qua code.
Cách dùng
- Đặt
declare(strict_types=1);ngay đầu file, sau<?php. - Dùng cho toàn bộ project, đừng chỉ một vài file. Không nhất quán thì vô nghĩa.
- Kết hợp với type hints cho parameters và return types để tận dụng tối đa.
Tham khảo: