什么是类型杂耍

PHP 是一种松散类型的语言。这意味着,默认情况下,它不要求表达式中的操作数具有相同(或兼容)类型。例如,你可以将一个数字附加到字符串并期望它可以工作。

var_dump ("This is example number " . 1);

输出将是:

string(24)“这是示例 1”

PHP 通过自动将不兼容的变量类型转换为允许所请求的操作发生的类型来实现此目的。在上面的例子中,它将整数文字 1 转换为一个字符串,这意味着它可以连接到前面的字符串文字。这被称为类型杂耍。这是 PHP 的一个非常强大的功能,但它也是一个功能,如果你不了解它可以导致你大量的头发拉动,甚至可能导致安全问题。

考虑以下:

if (1 == $variable) {
    // do something
}

意图似乎是程序员正在检查变量的值是否为 1.但是,如果$ variable 的值为 1,则会发生什么?答案可能会让你大吃一惊。

$variable = "1 and a half";
var_dump (1 == $variable);

结果是:

布尔(真)

为什么会这样?这是因为 PHP 意识到字符串“1 和半”不是整数,但它需要是为了将它与整数 1 进行比较。而不是失败,PHP 启动类型杂耍,并尝试将变量转换为整数。它通过将字符串开头的所有字符转换为整数并转换它们来完成此操作。它会在遇到不能被视为数字的字符时立即停止。因此,“1 和半”将转换为整数 1。

当然,这是一个非常人为的例子,但它有助于证明这个问题。接下来的几个例子将涵盖一些我遇到由真实软件中发生的类型杂耍引起的错误的情况。