一、前方有坑

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. C++学习笔记14_C#调用dll

    1. 首先C++创建dll项目,各种调第三方库,把这些东西都弄好后,整一个导出接口,例如: extern "C" __declspec(dllexport) int Add(int ...

  2. SpringMVC----执行流程+底层解析

    SpringMVC流程图如上面所示,根据上图,串联一下底层源码: 1.在DispatcherServlet中找到doDisPatch 2.观察方法体,然后找到getHandler方法 3.点进方法,发 ...

  3. [Hadoop]HDFS机架感知策略

    HDFS NameNode对文件块复制相关所有事物负责,它周期性接受来自于DataNode的HeartBeat和BlockReport信息,HDFS文件块副本的放置对于系统整体的可靠性和性能有关键性影 ...

  4. 简述同步和异步,以及js的任务队列.

    javascript是单线程的一门语言,所以在执行任务的时候,所有任务必须排队,然后一个一个的执行.这就是同步模式 所以同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个 ...

  5. SSHD服务安全的连接

    SSHD服务 SSH 安全的远程连接 OpenSSH 工具 centos服务端的包:openssh-server centos客户端的包:openssh-clients 主要配置文件一般安装完成后再/ ...

  6. MySQL系列:Windows 下 MySQL 8.X 的安装

    之前一直使用的是MySQL5.7,但由于MySQL增加了一些新特性,所以选择了更新. 下载MySQL 进入MySQL官网下载地址,选择Windows (x86, 64-bit), ZIP Archiv ...

  7. PHP创建文件命名中文乱码解决的方法

    PHP创建文件命名中文乱码解决的方法 <pre>iconv('utf-8', 'gbk', $dir); </pre> 因为系统环境是gbk 所以里面的字符也要gbk 编码一致 ...

  8. php charles 使用方法

    php charles 使用方法 打开charles 点击help菜单点击local ip address 可以获取本地ip 手机上选择代理这个ip 端口8888 然后手机访问网页 charles会弹 ...

  9. len、is、==、可变于不可变类型

    a="asdfghjkl;'iuygb" b="小米" c=['a','b','c'] d= {'name':1,'age':24} # len统计字符或元素的 ...

  10. centos6升级openssh至7.9

    1.为了防止升级失败登陆不了,所以需要安装telnet mkdir /root/ssh_updateyum install -y telnet-serveryum install -y xinetd ...