一、数值与字符串比较(这个在CTF中最常考)
当一个数值和一个字符串进行比较时,字符串会先尝试转换为数值再进行比较。转换的规则是:如果字符串以数字开头,那么就会从字符串开头提取数字部分,直到遇到非数字字符为止,然后将提取的数字部分作为数值进行比较;如果字符串不以数字开头,则转换后的数值为 0。
例如:0 == "abc"结果为true,因为字符串"abc"转换为数值是 0;123 == "123abc"结果为true,因为字符串"123abc"转换为数值是 123;456 == "abc123"结果为false,因为字符串"abc123"转换为数值是 0。
二、布尔值与其他类型比较
true会被转换为 1,false会被转换为 0,然后再与其他类型进行比较。
例如:true == 1结果为true;false == 0结果为true;true == "1"结果为true,因为字符串"1"转换为数值是 1;false == ""结果为true,因为空字符串转换为数值是 0。
三、数组与其他类型比较
数组与数值、字符串、布尔值等其他类型比较时,除非数组为空,否则都为false。空数组与0、""、false比较结果都为true。
例如:[] == 0结果为true;[] == ""结果为true;[] == false结果为true;[1,2,3] == 1结果为false。
四、对象与其他类型比较
当对象与其他类型进行比较时,会尝试将对象转换为标量类型(数值、字符串、布尔值等),如果对象没有定义相应的转换方法,则通常会返回false。
例如:定义一个类class MyClass {},$obj = new MyClass();,那么$obj == 1结果为false。
NULL 与其他类型比较
NULL与数值 0、空字符串""、false比较结果都为true,但与其他非空字符串、非 0 数值、true等比较结果为false。
例如:NULL == 0结果为true;NULL == ""结果为true;NULL == false结果为true;NULL == "abc"结果为false;NULL == 1结果为false。