什么是动态打字?

时间:2011-09-12 22:21:29

标签: php dynamic typing

我听说这个术语与PHP等脚本语言一起使用。究竟是什么意思?

1 个答案:

答案 0 :(得分:19)

动态类型是语言的明确特征。简短的解释可能是:

  

当语言不关联值时,语言具有动态类型   严格按照特定类型,但它旨在“决定”什么   根据您尝试使用它的方式,值的类型应该在运行时。

例如,在PHP中你可以写

$count = "5"; // defines a string variable

然后继续说

$count = $count * 2; // this is legal and has the obvious result¹

这里发生了什么?首先,编译器没有抱怨你试图将一个字符串乘以一个数字并拒绝编译该程序(例如在C,C ++,C#和Java等语言中会发生)。它生成的代码可以将参数$count2转发给乘法运算符,就像您提出并继续前进一样。

现在编译程序,动态类型在运行时生效。当乘法运算符到处查看其操作数时,它会检查当前的内容,如果愿意,可以查看每个操作数的类型。和以前一样,它是一个字符串和一个int。但是运算符知道它只能乘以两个整数(为了简单起见,我们忽略浮点数),所以它必须以某种方式从字符串中产生一个整数值。所有动态类型语言在所有值类型对之间都有rules that stipulate how such a conversion works;在这种情况下,PHP produces the integer 5来自字符串“5”。

您可能遇到的动态类型的另一个方面是duck typing;这仅适用于类类型的值(即非基元)。简而言之,鸭子打字规定了当你写作时

$object->quack();

编译器不会尝试查看$object是否属于具有不带参数的名为quack的方法的类型。相反,它将在运行时尝试查看$object是否实际具有这样的方法;如果是,则无论何种类型,都将调用该方法 我们掌握的对象(可能是一只鸭子,可能是所有编译器关心的狗)。

<强>脚注:

¹将字符串乘以整数是动态类型的全部内容(从字符串生成一个整数,因为乘法需要一个);但是,这里还有松散输入(允许乘法编译而不能证明两个操作数实际上是整数)。