すべての動的言語はダックタイピングをサポートしていますか?
PHPはダックタイピングをサポートしていると思います。そうですか?
動的に型付けされる oop 言語は、php を含め、ダックタイピングをサポートしています。
これは機能ではなく、むしろプログラミング スタイルです。
静的型付けとは、一度変数を定義すると、その変数はその存続期間中同じ型のままであることを意味します。通常、静的言語では型を宣言する必要がありますが、型推論を持つものもあります。それらは、定義から型を推論します。たとえば、scala では、次のように記述できます。コンパイラは の型を bei = 1
と推測しますが、 を宣言することはできません。これはエラーをスローします。i
int
i = "1"
動的型付けとは、変数の型を宣言する必要がなく、変数の型を変更できることを意味します。ruby ではそのままでi = 1
問題i = "1"
ありません。
ダックタイピングは、オブジェクト指向言語にほぼ独占的に適用される別の概念です。Duck 型付けを使用する言語では、メソッドへの引数の型がチェックされないため、メソッドが受け取った呼び出しに応答する限り、メソッドに渡す型はどれでも受け入れられます。
たとえば、次のようになります。
class Duck
def quacks
puts "Quack"
end
end
class FauxDuck
def quacks
puts "FauxQuack"
end
end
def quacker duck
duck.quacks
end
メソッド quacker は、Duck または FauxDuck のいずれかを取ります。.quacks
ほとんどのオブジェクト指向の動的型付け言語もダック型付けされていますが、必須ではありません。メソッド呼び出しに型を宣言してそれらを強制する言語を使用することもできますが、それでも動的に型付けされます。動的型付けとは、定義した後でオブジェクトの型を変更できることを意味するだけです。
架空の非ダック型ルビー
class Duck
def quacks
puts "Quack"
end
end
class FauxDuck
def quacks
puts "FauxQuack"
end
end
def quacker Duck duck
duck.quacks
end
duck = Duck.new
quacker.duck ## no error
duck = FauxDuck.new ##redefining the type of the variable
quacker.duck ## throws an error at runtime
なぜこれをしたいのか、私にはわかりませんが、言語設計者が利用できる選択肢です。
はい、PHP はダックタイプの言語です。
$x = 1;
$x = 'string';
$x = new Person;
$x = 1 / 2;