Мої динамічно типізовані мови, які я знаю, ніколи не дозволяють розробникам вказувати типи змінних або принаймні мати дуже обмежену підтримку.
Наприклад, 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.
}
Який коротший написати? Який легше читати?