一、前方有坑

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. 转:XSS和CSRF原理及防范

    原文地址:http://www.freebuf.com/articles/web/39234.html 随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来 ...

  2. [数据同步]Flume 抽取Mysql历史数据

    一.Flume安装目录 1.安装部署目录 [admin@test01 apache-flume-1.9.0-bin]$ pwd /opt/apache-flume-1.9.0-bin 2.将所需jar ...

  3. [考试反思]0812NOIP模拟测试18:稀释

    []200 [4]190[5]180 [6]170[7]150 [11]140[16]130[19]120[24]100 有些事情,看淡了,也就简单了. 连续爆炸之后,没什么感觉了. 把态度放正,把结 ...

  4. EffectiveJava-4

    一.基本类型优先于装箱基本类型 Java的基本数据类型也叫做内置类型是java语言本身提供的数据类型,是引用其他类型的基础.Java的基本数据类型分为:整数类型.浮点类型.字符类型.布尔类型这四个类型 ...

  5. Google I/O 大会上提出的UI优化相关

    1.ListView的Adapter Adapter在ListView中的工作原理是: 上图也正好反映出ListView使用了Adapter来适配数据源. 每一个Item条目都是通过Adapter.g ...

  6. 搜索框(SearchView)用法

    SearchView是Android原生的搜索框控件,它提供了一个用户界面,可以让用户在文本框内输入文字,并允许通过看监听器监控用户输入,当用户输入完成后提交搜索时,也可通过监听器执行实际的搜索. S ...

  7. [转载]2.4 UiPath循环活动While的介绍和使用

    一.While循环的介绍 先判断条件是否满足, 如果满足, 再执行循环体, 直到判断条件不满足, 则跳出循环 二.While循环在UiPath中的使用 1. 打开设计器,在设计库中新建一个Flowch ...

  8. Spring-Mybatis-SpringMVC三大框架整合

    我们直接切人正题,不多逼逼赖赖 第一步:依赖,一下的这些基本上是SSM整合的全部依赖 <!-- https://mvnrepository.com/artifact/org.springfram ...

  9. php 开启微信公众号开发者模式

    php 开启微信公众号开发者模式<pre><?php/** * wechat php test */header('Content-type:text');//define your ...

  10. Apache安装问题:APR not found

    资料来源:Apache遇到的问题:APR not found 安装apache时出现arp错误问题 按照以上文章试验之后整理如下: #./configure --prefix……检查编辑环境时出现: ...