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