对一道PHP比较运算符相关题目的思考

题目源码:

<?php
show_source(__FILE__);
$flag1="flag1 here";
$flag2="flag2 here";
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
    echo $flag1;
}
if(is_numeric($b)){
    exit();
}
if($b>1234){
    echo $flag2;
}
?>

分析:

很明显看出该题目考察的是对PHP的弱类型、比较运算符、以及类型转换的理解

要让第一个if中的条件成立则$a==0和$a都要为真,传入“纯数字”肯定是不行的,同时$b也一样,由此要先知道以下知识点:

1、HTML 表单并不传递整数、浮点数或者布尔值,它们只传递字符串

2、is_numeric ( mixed $var ) : bool — 检测变量是否为数字数字字符串 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。

3、比较运算符

例子             名称      结果

$a == $b      等于     TRUE,如果类型转换后 $a 等于 $b。

$a === $b    全等     TRUE,如果 $a 等于 $b,并且它们的类型也相同。

4、字符串转换为数值 当一个字符串被当作一个数值来取值,其结果和类型如下:

如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。

该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。

<?php
$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;          // $foo is float (11)
$foo = "10.0 pigs " + 1.0;        // $foo is float (11)     
?>

5、转换为布尔值

要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。

当转换为 boolean 时,以下值被认为是 FALSE:

  • 布尔值 FALSE 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)
  • 空字符串,以及字符串 "0"
  • 不包括任何元素的数组
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从空标记生成的 SimpleXML 对象

所有其它值都被认为是 TRUE(包括任何资源 和 NAN)。 Warning: -1 和其它非零值(不论正负)一样,被认为是 TRUE!

综上不难得出:

  • $a满足:首字符为0或其他任意非数字字符的字符串即可 如:a、0x、0x0
  • $b满足:开头为大于1234的数字的非纯数字字符串即可 如:1235a、0x2333sss

参考资料:

https://www.php.net/manual/zh/language.operators.php
https://www.php.net/manual/zh/types.comparisons.php
https://www.php.net/manual/zh/language.types.string.php#language.types.string.conversion
https://www.php.net/manual/zh/function.is-numeric.php
https://www.php.net/manual/zh/language.types.boolean.php

原文地址:https://www.cnblogs.com/BxScope/p/10816006.html