• php踩过的那些坑(3) 数据类型转换


    一、前方有坑

    php属于弱类型语言,不会强迫工程师在使用变量之前先声明变量类型,开发时爽了,但是也带来不少的坑。下面就举一个坑的例子:

    例1:

    $str = ‘haodaquan';

    echo ($str == 0) ? 1 : 0;

    运行结果是:

    1

    php踩过的那些坑(3) 数据类型转换这个坑,在好多公司的笔试题里出现,当然没有这么直接的考,会隐晦一些,比如下面的题目:例2

    $arr = [1,'aa'=>[2,2]];

    foreach ($arr as $key => $value) {

    if ($key=='aa') {

    var_dump($value);

    }

    }

    请问打印的结果是什么?

    原理是一样的:比较0==‘aa’,都是考察字符串和数字相比较,即数据类型转换的问题。

    结果如下:

    int(1)

    array(2) {

    [0]=>int(2)

    [1]=>int(2)

    }

    二、防坑攻略

    在做比较运算时,应考虑比较双方的类型,弱类型语言虽然对变量数据没有严格要求,编程时也应该对变量数据的类型有所判定。

    三、为何有坑

    “==”表示先将比较双方的类型转化成同一类型,然后在对值进行比较。在例1中,比较”haodaquan“==0,首先将字符串”haodaquan“默认转换为integer类型(为啥是integer类型呢?后面揭晓),我们知道 (int)”haodaquan“=0,而0==0是成立的,所以结果显示为1。

    四、防坑扩展

    彻底弄清楚这些类型转换(就是刚才例1中为啥转换为integer类型)才是防坑的关键。在php中数据类型之间的转换分为两种:强制类型转换和自动类型转换(有的也叫默认类型转换)。

    1、强制类型转换

    php数据类型转换的方法有三种,这里我们以字符串转浮点型为例,其他类型请自行查手册

    $s = "1a22aa.121";

    #第一种强制类型转换:

    var_dump((float)$s);

    #第二种强制类型转换:

    var_dump(floatval($s));

    #第三种强制类型转换:

    settype($s, 'float');

    var_dump($s);

    我经常使用第一种,简单。

    另外,字符串强制转换浮点型或者整型,会从左边逐一检查字符串,遇到不合格的字符出现就停止。

    2、自动类型转换

    1、算数运算符(加、减、乘、除、取余数等),自动按照数字型变量进行处理,也就是说,这些都是合法的。

    $a = '123b';

    $b = '12b';

    var_dump($a+$b,$a-$b,$a*$b,$a/$b,$a%$b);

    2、“==” 做比较,如果比较一方是布尔型,则另一方转为布尔型再比较值。

    如果比较一方是浮点型,则另一个先转为浮点型进行比较。(另一方非布尔型)

    如果比较一方是数字型,则另一个先转为数字型(int)进行比较。(另一方非布尔型和浮点型)

    以上估计够用了,想要更加深入,请参考php手册里的《PHP手册类型表》一节。

    五、防坑互动:

    1、下面代码:

    $s = "1.23a22aa.121";

    var_dump((float)$s);

    结果显示是:??

    2、补上期的互动题目,也是笔试题里经常设置的坑题:

    $a = count ("abc");

    $b = count ("");

    $c = count (null);

    $d = count (false);

    var_dump($a,$b,$c,$d);

    结果显示是:??

    3、补充一个烧脑的,估计答对的少:

    $a = '123b';

    $b = '12a';

    var_dump($a<$b);

    结果显示是:???

    请看官们讨论结果吧 !^_^

    php踩过的那些坑(3) 数据类型转换

  • 相关阅读:
    远程调试 ASP.NET MVC 项目
    两行代码搞定 JavaScript 的日期验证
    ASP.NET MVC 静态资源打包和压缩问题小记
    CodeSmith7连接Mysql
    网站开发烦心记-1
    感悟还是教训,或者。。。
    可以断点续传的scp
    CTP报单状态
    android studio 0.8.8下载
    期货结算单查询
  • 原文地址:https://www.cnblogs.com/phpfensi/p/8143360.html
Copyright © 2020-2023  润新知