我听说这个术语与 PHP 等脚本语言一起使用。它到底是什么意思?
1 回答
动态类型是一种语言的决定性特征。一个简短的解释可能是:
一种语言在不将值与特定类型严格关联时具有动态类型,但它旨在根据您尝试使用它的方式在运行时“决定”值的类型应该是什么。
例如,在 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
真的有这样的方法;如果是这样,无论我们手头有什么类型的对象(可能是鸭子,可能是所有编译器关心的狗),都会调用该方法。
脚注:
¹ 将字符串乘以整数是动态类型的全部内容(从字符串中生成整数,因为乘法需要一个整数);但是,这里也有松散的类型(允许编译乘法但无法证明两个操作数实际上都是整数)。