我理解它的方式,PHP允许以下内容,因为它是一种弱类型的语言。
$var = 'Hello';
$var = 5;
我刚刚安装了一个Windows版本的Python 2.6,我希望它不要让我像这样更改类型,但上述代码的Python等效工作就像在PHP中一样!
>>> var = "Hello"
>>> type(var)
<type 'str'>
>>> var = 5
>>> type(var)
<type 'int'>
我对弱/强打字的理解是否有缺陷?
答案 0 :(得分:40)
您的示例演示了动态输入,而不是弱输入。动态类型通常意味着对象可以存储的数据类型是可变的;任何目标都可以绑定任何类型的对象。与C#相比较,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是静态的”。它比滑动尺度或光谱更像是二元属性。
答案 1 :(得分:5)
第一个答案的一个补充: 这有点复杂,因为在python中,+运算符被重载意味着它将添加(数学)和连接(粘合两个字符串)。 在php示例中
$i = 1 + "1" // $i == 2
加号(数学)因为。 (点)用于连接,所以在php
$i = 1 . "1" // $i == "11"
我想弄清楚的是,每种弱类型/动态语言都以自己的方式处理。
答案 2 :(得分:4)
没有关于弱打字或强打字的真正定义。它完全与隐式类型转换有关,与静态/动态类型无关。
像Java 这样的静态类型语言可以弱类型(不是那样),并且像这样的动态类型语言可以强类型化(不是它的类型) )。
弱类型语言在某些操作中可以混合使用哪种数据类型更为自由。
答案 3 :(得分:2)
是。这不是强/弱打字,即静态/动态打字。弱键入允许诸如5 + '5'
之类的东西等于10。