Ваш пример демонстрирует динамическую печать, а не слабую печать. Динамическая типизация обычно означает, что тип данных, которые может хранить объект, является изменчивым; любая цель может содержать привязку к любому виду объекта. Сравните это, скажем, с 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
<Ч />
[*] Технически, начиная с C # 4, C # статически типизирован, но с опциональной динамической типизацией для каждой привязки, благодаря ключевому слову dynamic
. Многие языки в наши дни добавляют динамические возможности и размывают линии, поэтому все труднее говорить о том, что «язык X является динамическим» и «язык Y является статическим». Это гораздо больше скользящей шкалы или спектра, чем двоичного свойства.