ภาษาที่พิมพ์แบบไดนามิกที่ฉันรู้ว่าไม่ให้นักพัฒนาระบุประเภทของตัวแปรหรืออย่างน้อยก็มีการสนับสนุนที่ จำกัด มากสำหรับสิ่งนั้น
ตัวอย่างเช่น JavaScript ไม่มีกลไกใด ๆ ในการบังคับใช้ตัวแปรประเภทต่างๆเมื่อสะดวกในการใช้งาน PHP ช่วยให้คุณระบุบางชนิดของการขัดแย้งวิธี แต่มีวิธีที่จะใช้ชนิดพื้นเมือง (ไม่int
, string
ฯลฯ ) สำหรับข้อโต้แย้งและมีวิธีการที่จะบังคับใช้สำหรับประเภทอื่นใดนอกเหนือจากการขัดแย้งใด
ในเวลาเดียวกันมันจะสะดวกที่จะมีทางเลือกที่จะระบุในบางกรณีประเภทของตัวแปรในภาษาที่พิมพ์แบบไดนามิกแทนการทำประเภทการตรวจสอบด้วยตนเอง
ทำไมมีข้อ จำกัด ดังกล่าว เป็นเพราะเหตุผลด้านเทคนิค / ประสิทธิภาพ (ฉันคิดว่ามันเป็นในกรณีของ JavaScript) หรือสำหรับเหตุผลทางการเมืองเท่านั้น (ซึ่งฉันเชื่อว่าเป็นกรณีของ PHP) นี่เป็นกรณีสำหรับภาษาที่พิมพ์แบบไดนามิกอื่น ๆ ที่ฉันไม่คุ้นเคยหรือไม่
แก้ไข:ทำตามคำตอบและความคิดเห็นต่อไปนี้เป็นตัวอย่างสำหรับการชี้แจง: สมมติว่าเรามีวิธีการต่อไปนี้ใน PHP ธรรมดา:
public function CreateProduct($name, $description, $price, $quantity)
{
// Check the arguments.
if (!is_string($name)) throw new Exception('The name argument is expected to be a string.');
if (!is_string($description)) throw new Exception('The description argument is expected to be a string.');
if (!is_float($price) || is_double($price)) throw new Exception('The price argument is expected to be a float or a double.');
if (!is_int($quantity)) throw new Exception('The quantity argument is expected to be an integer.');
if (!$name) throw new Exception('The name argument cannot be an empty string.');
if ($price <= 0) throw new Exception('The price argument cannot be less or equal to zero.');
if ($price < 0) throw new Exception('The price argument cannot be less than zero.');
// We can finally begin to write the actual code.
// TODO: Implement the method here.
}
ด้วยความพยายามบางอย่างนี้สามารถเขียนใหม่เป็น (ดูการเขียนโปรแกรมโดยสัญญาใน PHP ):
public function CreateProduct($name, $description, $price, $quantity)
{
Component::CheckArguments(__FILE__, __LINE__, array(
'name' => array('value' => $name, 'type' => VTYPE_STRING),
'description' => array('value' => $description, 'type' => VTYPE_STRING),
'price' => array('value' => $price, 'type' => VTYPE_FLOAT_OR_DOUBLE),
'quantity' => array('value' => $quantity, 'type' => VTYPE_INT)
));
if (!$name) throw new Exception('The name argument cannot be an empty string.');
if ($price <= 0) throw new Exception('The price argument cannot be less or equal to zero.');
if ($price < 0) throw new Exception('The price argument cannot be less than zero.');
// We can finally begin to write the actual code.
// TODO: Implement the method here.
}
แต่วิธีการเดียวกันนี้จะถูกเขียนดังนี้ถ้า PHP เลือกยอมรับชนิดเนทีฟสำหรับอาร์กิวเมนต์:
public function CreateProduct(string $name, string $description, double $price, int $quantity)
{
// Check the arguments.
if (!$name) throw new Exception('The name argument cannot be an empty string.');
if ($price <= 0) throw new Exception('The price argument cannot be less or equal to zero.');
if ($price < 0) throw new Exception('The price argument cannot be less than zero.');
// We can finally begin to write the actual code.
// TODO: Implement the method here.
}
อันไหนที่สั้นกว่าที่จะเขียน? อ่านอันไหนง่ายกว่ากัน?