zoukankan      html  css  js  c++  java
  • 对一道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

  • 相关阅读:
    linux字符设备文件的打开操作
    Linux用ps命令查找进程PID再用kill命令终止进程的方法
    Linux内核锁与中断处理
    写给大数据开发初学者的话
    zabbix监控系统客户端安装
    详解zabbix安装部署(Server端篇)
    Keepalived+Nginx架构整理版
    Nginx + Tomcat 动静分离实现负载均衡
    五个常用的Linux监控脚本代码
    16个Linux服务器监控命令
  • 原文地址:https://www.cnblogs.com/BxScope/p/10816006.html
Copyright © 2011-2022 走看看