PHP 变量和常量:弱类型语言 1 个改进

问题

随着学习 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 手册中的一段话:

当一个字符串当作一个数值来取值时,其结果和类型如下:如果该字符串没有包含 .eE 并且其数值在整型 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 也可以通过验证。

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!