あなたの例は、弱い型付けではなく動的型付けを示しています。動的型付けは、通常、オブジェクトが格納できるデータの型が変更可能であることを意味します。どのターゲットも、あらゆる種類のオブジェクトへのバインディングを保持できます。たとえば、静的に型指定された [*] である 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 は静的」であるとは言い難くなっています。これは、バイナリ プロパティというよりも、スライディング スケールまたはスペクトルに近いものです。