PHP 变量和常量:弱类型语言
问题
随着学习 PHP 的深入,我们经常会看到 PHP 是弱类型语言的说法。那么,为什么 PHP 属于弱类型语言呢?
回答
一般来说,如果一门编程语言允许两种数据类型之间进行隐式转换的即为弱类型语言,这么说非常晦涩,我们可以通过一个例子进行分析:
<?php
$var = 123;
var_dump($var);
echo '<br>';
$var = '123';
var_dump($var);
运行结果:
int(123)
string(3) "123"
在例 1 中我们首先创建了一个命名为 $var
的变量,并赋值为整数类型。如果 PHP 为强类型语言,那么接下来我们只能改变 $var
的值为另一个整数值。但是,在没有重新声明变量类型的情况下,我们成功地将字符串「123」赋值给了 $var
,所以 PHP 编译器是支持这种操作的。因此,PHP 是允许两种数据类型之间进行隐式转换的弱类型编程语言。
弱类型漏洞
引用 PHP 手册中的一段话:
当一个字符串当作一个数值来取值时,其结果和类型如下:如果该字符串没有包含
.
,e
,E
并且其数值在整型int
的范围之内,该字符串会被当作int
来取值,其他所有情况下都被当作float
来取值。并且该字符串的起始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其数值为整数 0。
因此,在 PHP 编程中可能会出现如下 switch
语句例子的验证漏洞:
<?php
$var = "4 abcde";
switch ($var) {
case 1:
echo "fail";
break;
case 2:
echo "fail";
break;
case 3:
echo "fail";
break;
case 4:
echo "success";
break;
default: echo "fail";
break;
}
运行结果:
success
在本例中,我们希望当 $var
的值为 4
的时候才输出 success
。但是,由于 PHP 的弱类型转换,使 4 abcde
也可以通过验证。