php踩过的那些坑(3) 数据类型转换
一、前方有坑
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) 数据类型转换的更多相关文章
- 【Fine原创】JMeter分布式测试中踩过的那些坑
最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
- Redis上踩过的一些坑
来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DB ...
- Android Camera开发经验总结以及踩过的那些坑
写在开头 需求方:上传试卷的时候,用户自己拍的照片有很多问题.如:不清晰.图片歪了.错误图片等.我们要是能够对拍摄照片进行识别处理就好了,能够裁切矫正就更好了,最好可以像二维码扫描一样,直接识别处理- ...
- [转帖]美团在Redis上踩过的一些坑-4.redis内存使用优化
美团在Redis上踩过的一些坑-4.redis内存使用优化 博客分类: 运维 redis redisstringhash优化segment-hash 转载请注明出处哈:http://carlosfu ...
- [转帖]美团在Redis上踩过的一些坑-3.redis内存占用飙升
美团在Redis上踩过的一些坑-3.redis内存占用飙升 博客分类: 运维 redis redismonitor内存突增client listinfo 转载请注明出处哈:http://car ...
- [转帖]美团在Redis上踩过的一些坑-2.bgrewriteaof问题
美团在Redis上踩过的一些坑-2.bgrewriteaof问题 博客分类: redis 运维 aofaof rewrite 转载请注明出处哈:http://carlosfu.iteye.com/b ...
- [转帖]美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout
美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout 博客分类: redis 运维 jedisconnect timeoutnosqltcp 转载请注明出处哈:http ...
- 三分之一的程序猿之社交类app踩过的那些坑
三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...
- 与webview打交道中踩过的那些坑
随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...
随机推荐
- Web for pentester_writeup之XML attacks篇
Web for pentester_writeup之XML attacks篇 XML attacks(XML攻击) Example 1 - XML外部实体注入(XXE) Payload http:// ...
- 题解【洛谷】CF134A
题解 CF134A [Average Numbers] 这题就是简单的模拟. 只不过要优化一下常数什么的 思路: 为了不浪费时间总是取平均数,直接用一个 S 储存总和,每次都减去 a_i 再除以 n ...
- Pandas 时间序列
# 导入相关库 import numpy as np import pandas as pd 在做金融领域方面的分析时,经常会对时间进行一系列的处理.Pandas 内部自带了很多关于时间序列相关的工具 ...
- [考试反思]0916csp-s模拟测试44:可笑
出现了有史以来第一个3首杀AK啊...然而跟我没有丝毫关系 (曾经还是有一次考试差点就有那么一点关系的...) 然而反正我考得很水就是了.不是很垃圾,而是很水. 这套题是真的水... T1不会证复杂度 ...
- NOIP模拟测试9
又考崩了咕咕咕... T1:随 好题标记 前置芝士: 原根:质数P的原根g满足1<=rt<P,且rt的1次方,2次方…(P-1)次方在模P意义下可以取遍1到(P-1)的所有整数. ...
- formdata,ajax提交数据
var data = document.getElementById("#dataForm"); var formData = new FormData(data); var ac ...
- curl太复杂难用记不住?来试试Httpie一个简单的现代化命令行Http客户端
HTTPie 是一个简单的现代化命令行 HTTP 客户端. 交互友好,JSON支持,语法高亮,类wget下载,支持拓展等 功能特性 自然而且简单的命令语句 格式化且高亮显示输出内容 内置 JSON 支 ...
- NLP-BM25算法理解
前两天老师给我们讲解了BM25算法,其中包括由来解释,以及算法推导,这里我再将其整理,这里我不讲解之前的BIM模型,大家有兴趣可以自行了解.Okapi BM25:一个非二值的模型bm25 是一种用来评 ...
- 去重算法,简单粗暴&优化版
Remove Repeat 一.去重原理 1.进行排序 2.判断是否满足 '两个字符串相同' 的条件,相同则累加重复次数,并使用continue继续下一次循环 3.当条件不满足时,将该字符串和累计数加 ...
- 类型擦除真的能完全擦除一切信息吗?java 泛型揭秘
背景 我们都知道泛型本质上是提供类型的"类型参数",它们也被称为参数化类型(parameterized type)或参量多态(parametric polymorphism).其实 ...