一、前方有坑

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

例1:

$str = ‘haodaquan';

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

运行结果是:

1

这个坑,在好多公司的笔试题里出现,当然没有这么直接的考,会隐晦一些,比如下面的题目:例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) 数据类型转换的更多相关文章

  1. 【Fine原创】JMeter分布式测试中踩过的那些坑

    最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...

  2. Redis上踩过的一些坑

    来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DB ...

  3. Android Camera开发经验总结以及踩过的那些坑

    写在开头 需求方:上传试卷的时候,用户自己拍的照片有很多问题.如:不清晰.图片歪了.错误图片等.我们要是能够对拍摄照片进行识别处理就好了,能够裁切矫正就更好了,最好可以像二维码扫描一样,直接识别处理- ...

  4. [转帖]美团在Redis上踩过的一些坑-4.redis内存使用优化

    美团在Redis上踩过的一些坑-4.redis内存使用优化 博客分类: 运维 redis redisstringhash优化segment-hash  转载请注明出处哈:http://carlosfu ...

  5. [转帖]美团在Redis上踩过的一些坑-3.redis内存占用飙升

    美团在Redis上踩过的一些坑-3.redis内存占用飙升 博客分类: 运维 redis redismonitor内存突增client listinfo     转载请注明出处哈:http://car ...

  6. [转帖]美团在Redis上踩过的一些坑-2.bgrewriteaof问题

    美团在Redis上踩过的一些坑-2.bgrewriteaof问题 博客分类: redis 运维 aofaof rewrite  转载请注明出处哈:http://carlosfu.iteye.com/b ...

  7. [转帖]美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout

    美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout 博客分类: redis 运维 jedisconnect timeoutnosqltcp  转载请注明出处哈:http ...

  8. 三分之一的程序猿之社交类app踩过的那些坑

    三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...

  9. 与webview打交道中踩过的那些坑

    随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...

随机推荐

  1. CSPS模拟 52

    我貌似曾经说过我是个只会做水题的巨型辣鸡.. 这次证明我水题都不会做.. T1 平均数 区间数$n^2$ 枚举是不可能了 可是好像没有无用的计算量.. 刚想到这里,此时开考15min 看见天皇比手势说 ...

  2. python线程threading.Timer源码解读

    threading.Timer的作用 官方给的定义是: """Call a function after a specified number of seconds: t ...

  3. php PDO getlastsql写法

    php PDO getlastsql写法有些时候 运行失败需要查看 sql语句 原型有没有语法错误 这个时候就用 下面的函数就是把问号替换成 值 就可以看到原型了<pre>function ...

  4. Web微信开发工具无法输入中文?官方bug

    Ctrl+shift+w 重启工具就OK啦

  5. 数据仓库ETL案例学习(一)

    来自课程案例学习   某跨国食品超市的信息管理系统,每天都会记录成千上万条各地连锁超市的销售数据.基于大数据的背景,该公司的管理层决定建立FoodMart数据仓库,期望能从庞大的数据中挖掘出有商业价值 ...

  6. servlet三大组件

    servlet大致可以分为三个:简单servlet.过滤servlet.监听servlet servlet: servlet的创建 创建一个类并实现Servlet接口. 重写service方法. 在服 ...

  7. T-SQL Part V: Locks

    写SQL最常见的问题就是Dead Lock了.本篇简单介绍入门级别的Lock使用和排查. 首先来看MSDN上的官方文档(https://technet.microsoft.com/en-us/libr ...

  8. PHP 核心特性 - 匿名函数

    提出 在匿名函数出现之前,所有的函数都需要先命名才能使用 function increment($value) { return $value + 1; } array_map('increment' ...

  9. [LC] 108题 将有序数组转换为二叉搜索树 (建树)

    ①题目 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,- ...

  10. mpvue开发微信小程序,分享按钮报错:`Cannot read property 'apply' of null`

    用mpvue开发微信小程序,分享按钮报错:Cannot read property 'apply' of null onShareAppMessage 是于微信小程序Pages的生命周期钩子,顾这个方 ...