题目源码:
<?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