私が知っている動的に型付けされた言語は、開発者に変数の型を指定させたり、少なくともそれを非常に限定的にサポートさせたりすることはありません。
たとえば、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.
}
どちらを書くのが短いですか?読みやすいのはどれですか?