Динамическая типизация является определяющей характеристикой языка.Краткое объяснение может быть следующим:
Язык имеет динамическую типизацию, когда он не связывает значения строго с конкретным типом, но он предназначен для «решения», каким должен быть тип значения во время выполненияв зависимости от того, как вы пытаетесь его использовать.
Например, в PHP вы можете написать
$count = "5"; // defines a string variable
, а затем сказать
$count = $count * 2; // this is legal and has the obvious result¹
Что здесь произошло?С одной стороны, компилятор не жаловался, что вы пытаетесь умножить строку на число и отказываетесь компилировать программу (как это происходит в таких языках, как C, C ++, C # и Java).Он создал код для пересылки аргументов $count
и 2
оператору умножения, как вы и просили.
После компиляции программы динамическая типизация вступает в силу во время выполнения .Когда оператор умножения просматривает свои операнды, он проверяет, является ли текущий тип, если хотите, типом каждого из них.Как и прежде, это строка и int.Но оператор знает, что он может умножить только два целых числа (давайте для простоты проигнорируем числа с плавающей запятой), поэтому он должен каким-то образом получить целое значение из строки.Все динамически типизированные языки имеют правила , которые определяют, как такое преобразование работает между всеми парами типов значений;в этом случае PHP выдает целое число 5 из строки "5".
Другой аспект динамической типизации, с которым вы можете столкнуться, называется duck typing ;это относится только к значениям типов классов (т.е. не к примитивам).Короче говоря, при утилитарной типизации при написании
$object->quack();
компилятор не будет пытаться определить, относится ли $object
к типу, который имеет метод с именем quack
, который не принимает аргументов.Скорее, он попытается во время выполнения проверить, есть ли у $object
такой метод;если это произойдет, метод будет вызван независимо от того, какой тип объекта у нас под рукой (может быть утка, может быть собака для всех забот компилятора).
Сноски:
¹ Умножение строки на целое число - вот что такое динамическая типизация - это все (создание целого числа из строки, потому что умножение требует его);тем не менее, здесь также работает свободный ввод (что позволяет умножению компилироваться без возможности доказать, что оба операнда действительно являются целыми числами).