PHP, như hầu hết chúng ta đều biết, có kiểu gõ yếu . Đối với những người không, PHP.net nói:
PHP không yêu cầu (hoặc hỗ trợ) định nghĩa kiểu rõ ràng trong khai báo biến; một loại biến được xác định bởi bối cảnh sử dụng biến đó.
Yêu hay ghét nó, PHP lại đưa ra các biến khi đang di chuyển. Vì vậy, đoạn mã sau là hợp lệ:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP cũng cho phép bạn truyền một cách rõ ràng một biến, như vậy:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
Điều đó thật tuyệt ... nhưng, đối với cuộc sống của tôi, tôi không thể hình dung ra một lý do thực tế để làm điều này.
Tôi không gặp vấn đề với việc gõ mạnh vào các ngôn ngữ hỗ trợ nó, như Java. Điều đó tốt, và tôi hoàn toàn hiểu nó. Ngoài ra, tôi biết - và hiểu đầy đủ về tính hữu ích của - gợi ý loại trong các tham số chức năng.
Vấn đề tôi có với kiểu đúc được giải thích bằng trích dẫn ở trên. Nếu PHP có thể hoán đổi các loại theo ý muốn , thì nó có thể làm như vậy ngay cả sau khi bạn buộc ép kiểu; và nó có thể thực hiện nhanh chóng khi bạn cần một loại nhất định trong một hoạt động. Điều đó làm cho các giá trị sau:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
Vậy quan điểm là gì?
Lấy ví dụ lý thuyết này về một thế giới nơi việc truyền kiểu do người dùng định nghĩa có ý nghĩa trong PHP :
- Bạn buộc biến cast
$foo
làint
→(int)$foo
. - Bạn cố gắng lưu trữ một giá trị chuỗi trong biến
$foo
. - PHP ném một ngoại lệ !! ← Điều đó sẽ có ý nghĩa. Đột nhiên, lý do cho người dùng xác định loại đúc tồn tại!
Việc PHP sẽ chuyển đổi mọi thứ xung quanh khi cần thiết khiến cho việc xác định kiểu người dùng xác định kiểu mơ hồ. Ví dụ, hai mẫu mã sau đây là tương đương:
// example 1
$foo = 0;
$foo = (string)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
// example 2
$foo = 0;
$foo = (int)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
Một năm sau khi ban đầu đặt câu hỏi này, hãy đoán xem ai đã tìm thấy chính mình bằng cách sử dụng typecasting trong một môi trường thực tế? Bạn thật sự.
Yêu cầu là hiển thị giá trị tiền trên một trang web cho menu nhà hàng. Thiết kế của trang web yêu cầu các số 0 ở cuối được cắt bớt, để màn hình hiển thị trông giống như sau:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
Cách tốt nhất tôi tìm thấy để làm lãng phí đó để biến biến thành một dấu phẩy:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP cắt các số 0 ở cuối của float, và sau đó lấy lại số float như một chuỗi để nối.
(string)
phôi ở khắp mọi nơi ?
$intval.'bar'
ném một ngoại lệ, tôi vẫn không đồng ý. Điều đó không ném một ngoại lệ trong bất kỳ ngôn ngữ. (Tất cả các ngôn ngữ tôi biết thực hiện là diễn viên tự động hoặc a .toString()
). Nếu bạn đang nói $intval = $stringval
ném một ngoại lệ, thì bạn đang nói về một ngôn ngữ được gõ mạnh. Tôi không có ý nói thô lỗ, vì vậy, xin lỗi nếu tôi đã làm. Tôi chỉ nghĩ rằng nó đi ngược lại với những gì mọi nhà phát triển đã quen và ít tiện lợi hơn nhiều.