12

私が理解している方法では、PHP は弱い型付けの言語であるため、PHP では次のことが許可されています。

$var = 'Hello';
$var = 5;

Python 2.6 の Windows バージョンをインストールしたばかりで、そのように型を変更できないと思っていましたが、上記のコードに相当する Python は PHP のように機能します。

>>> var = "Hello"
>>> type(var)
<type 'str'>
>>> var = 5
>>> type(var)
<type 'int'>

弱い/強い型付けの理解に欠陥がありますか?

4

4 に答える 4

45

あなたの例は、弱い型付けではなく動的型付けを示しています。動的型付けは、通常、オブジェクトが格納できるデータの型が変更可能であることを意味します。どのターゲットも、あらゆる種類のオブジェクトへのバインディングを保持できます。たとえば、静的に型指定された [*] である C# とは対照的です。

int i = 5; // Okay.
i = "5";   // Illegal! i can only hold integers.

強力な型付けとは、特定の種類の値が割り当てられると、オブジェクトがさまざまな種類の他のオブジェクトとどのようにやり取りできるかについて、厳密な規則に従うことを意味します。弱い型付けとは、そのような規則がより緩和されることを意味します。これは、厳密に型指定された言語が必ずしも優れているという意味ではありません。それは単なる言語設計の選択です。

Python は強く型付けされていると見なされます。これは、オブジェクトがその型付けについて明確な概念を持っているためです。オブジェクト間で互換性のない操作を行うと、エラーが発生します。

>>> 1 + 1          # Add two integers.
2
>>> "1" + "1"      # Concatenate two strings.
'11'
>>> 1 + int("1")   # Add two integers.
2
>>> "1" + str(1)   # Concatenate two strings.
'11'
>>> 1 + "1"        # Undefined! Adding integers and strings is meaningless.
Traceback (most recent call last):
  File "", line 5, in ?
TypeError: unsupported operand type(s) for +: 'int' and 'str'

しかし、PHP では、何が受け入れられるかについて、ルールがはるかに緩和されています。したがって、他の言語よりも型付けが弱いと見なされます。

$x = 1 + "1"; // x is 2

dynamic[*] 技術的には、C# 4 の時点で、C# は静的に型付けされていますが、キーワードのおかげでバインディングごとにオプトインの動的型付けが行われています。最近の多くの言語は動的機能を追加し、境界線が曖昧になっているため、「言語 X は動的」であり、「言語 Y は静的」であるとは言い難くなっています。これは、バイナリ プロパティというよりも、スライディング スケールまたはスペクトルに近いものです。

于 2010-01-08T03:45:20.180 に答える
5

弱い型付けや強い型付けの本当の定義はありません。そのすべては暗黙的な型変換に関するものであり、静的/動的型付けとは何の関係もありません。

Javaのような静的に型付けされた言語は弱く型付けされる可能性があり(そうではありません)、PHPのような動的に型付けされた言語は強く型付けされる可能性があります(そうではありません)。

弱い型の言語は、特定の操作でどのデータ型を混在させることができるかについて、より自由です。

于 2010-01-08T03:56:41.560 に答える
5

最初の答えの1つの追加:Pythonでは + 演算子がオーバーロードされているため、追加(数学)と連結(2つの文字列の接着)の両方を意味するため、少し複雑です。PHPの例では

$i = 1 + "1" // $i == 2

プラスは(数学)を追加します。(ドット)は連結に使うので、phpでは

$i = 1 . "1" // $i == "11"

私が明確にしようとしているのは、弱く型付けされた/動的な言語はすべて、独自の方法でこれを処理するということです。

于 2010-01-08T04:35:41.100 に答える
2

はい。それは強い/弱い型付けではなく、静的/動的な型付けです。5 + '5'弱い型付けにより、 10 に等しいなどのことが可能になります。

于 2010-01-08T03:45:23.033 に答える