Jon*_*Jon 19
动态类型是语言的明确特征.一个简短的解释可能是:
当语言没有严格地将值与特定类型相关联时,语言具有动态类型,但它被设计为根据您尝试使用它的方式"决定"运行时值的类型.
例如,在PHP中你可以写
$count = "5"; // defines a string variable
Run Code Online (Sandbox Code Playgroud)
然后继续说
$count = $count * 2; // this is legal and has the obvious result¹
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?首先,编译器没有抱怨你试图将一个字符串乘以一个数字并拒绝编译该程序(例如在C,C++,C#和Java等语言中会发生).它生成了用于转发参数$count和2乘法运算符的代码,就像您提出并继续前进一样.
现在编译的程序,动态类型在运行时生效.当乘法运算符到处查看其操作数时,它会检查当前的内容,如果愿意,可以查看每个操作数的类型.和以前一样,它是一个字符串和一个int.但是运算符知道它只能乘以两个整数(为了简单起见,我们忽略浮点数),所以它必须以某种方式从字符串中产生一个整数值.所有动态类型语言都有规则,规定这种转换如何在所有值类型对之间起作用 ; 在这种情况下,PHP 从字符串"5" 生成整数5.
您可能遇到的动态类型的另一个方面是鸭子打字 ; 这仅适用于类类型的值(即非基元).简而言之,鸭子打字规定当你写作时
$object->quack();
Run Code Online (Sandbox Code Playgroud)
编译器不会尝试查看是否$object具有名为quack不带参数的方法的类型.相反,它会在运行时尝试查看$object实际上是否有这样的方法; 如果是这样的话,无论我们手头有什么类型的对象(可能是鸭子,可能是所有编译器关心的狗),都会调用该方法.
脚注:
¹将字符串乘以整数是动态类型的全部内容(从字符串生成一个整数,因为乘法需要一个); 但是,这里也有松散的输入(允许乘法编译而不能证明两个操作数实际上是整数).