PHP เป็นส่วนใหญ่ของเราทราบว่ามีการพิมพ์ที่อ่อนแอ สำหรับคนที่ไม่ทำ PHP.net พูดว่า:
PHP ไม่ต้องการคำนิยามประเภทที่ชัดเจน (หรือสนับสนุน) ในการประกาศตัวแปร ชนิดของตัวแปรถูกกำหนดโดยบริบทที่ใช้ตัวแปรนั้น
ไม่ว่าจะชอบหรือเกลียด PHP ก็สร้างตัวแปรใหม่ขึ้นมาทันที ดังนั้นรหัสต่อไปนี้ถูกต้อง:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP ยังอนุญาตให้คุณสร้างตัวแปรอย่างชัดเจนเช่น:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
ทั้งหมดนี้ยอดเยี่ยม ... แต่สำหรับชีวิตของฉันฉันไม่สามารถเข้าใจถึงเหตุผลที่ปฏิบัติได้สำหรับการทำเช่นนี้
ฉันไม่มีปัญหากับการพิมพ์ที่แข็งแกร่งในภาษาที่รองรับเช่น Java ไม่เป็นไรและฉันเข้าใจอย่างถ่องแท้ นอกจากนี้ฉันรู้และเข้าใจถึงประโยชน์ของการบอกกล่าวชนิดในพารามิเตอร์ฟังก์ชัน
ปัญหาที่ฉันมีกับการคัดเลือกนักแสดงอธิบายโดยข้อความข้างต้น ถ้า PHP สามารถสลับประเภทได้ตามต้องการก็สามารถทำได้แม้หลังจากที่คุณบังคับให้พิมพ์ และสามารถทำได้ทันทีเมื่อคุณต้องการประเภทที่แน่นอนในการดำเนินการ ที่ทำให้ถูกต้องดังต่อไปนี้:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
ดังนั้นประเด็นคืออะไร
ลองดูตัวอย่างเชิงทฤษฎีเกี่ยวกับโลกที่ผู้ใช้กำหนดรูปแบบการพิมพ์ใน PHP :
- คุณบังคับให้โยนตัวแปร
$foo
เป็น→int
(int)$foo
$foo
คุณพยายามที่จะเก็บค่าสตริงในตัวแปร- PHP พ่นข้อยกเว้น !! ←นั่นจะทำให้รู้สึก ทันใดนั้นมีเหตุผลสำหรับการคัดเลือกประเภทที่ผู้ใช้กำหนดอยู่!
ความจริงที่ว่า PHP จะสลับสิ่งต่าง ๆ ตามความจำเป็นทำให้ผู้ใช้กำหนดประเภทการหล่อไม่ชัดเจน ตัวอย่างเช่นโค้ดสองตัวอย่างต่อไปนี้เทียบเท่า:
// 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;
หนึ่งปีหลังจากที่เริ่มถามคำถามนี้เดาว่าใครที่พบว่าตัวเองใช้ typecasting ในสภาพแวดล้อมจริง ขอแสดงความนับถือ
ข้อกำหนดคือการแสดงค่าเงินในเว็บไซต์สำหรับเมนูร้านอาหาร การออกแบบไซต์ต้องการให้ตัดศูนย์ต่อท้ายเพื่อให้การแสดงผลมีลักษณะดังนี้:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
วิธีที่ดีที่สุดที่ฉันพบว่าทำอย่างนั้นเพื่อเลือกตัวแปรเป็นทุ่น:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP จดจ้องกับเลขศูนย์ต่อท้ายของ float จากนั้น recasts ลอยเป็นสตริงสำหรับการต่อข้อมูล
(string)
ปลดเปลื้องทุกที่ ?
$intval.'bar'
มีข้อยกเว้นฉันยังคงไม่เห็นด้วย ไม่ได้มีข้อยกเว้นในภาษาใด ๆ (ทุกภาษาที่ฉันรู้จักทำการแสดงอัตโนมัติหรือ.toString()
) หากคุณกำลังพูดว่า$intval = $stringval
เกิดข้อผิดพลาดคุณกำลังพูดถึงภาษาที่พิมพ์ออกมาอย่างรุนแรง ฉันไม่ได้ตั้งใจจะหยาบคายดังนั้นขอโทษด้วยถ้าฉันทำ ฉันคิดว่ามันขัดกับสิ่งที่นักพัฒนาซอฟต์แวร์ทุกคนคุ้นเคยและสะดวกสบายน้อยกว่ามาก