一、前方有坑

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);

结果显示是:???

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

最新文章

  1. camerc文件播放
  2. BZOJ4721 [Noip2016]蚯蚓
  3. Shell编程基础教程4--控制流结构
  4. ANE 从入门到精通 --- 简单的Whatever
  5. HTML JavaScript简介
  6. Python GUI库
  7. 《dive into python3》 笔记摘录
  8. java6 新特新
  9. Exploit搭建
  10. OC——UIlabel text的常规应用
  11. hdu 3397 Sequence operation 线段树
  12. css中绝对定位和相对定位详解
  13. 第七章 鼠标(CHECKER2)
  14. 【asp.net core】Publish to a Linux-Ubuntu 14.04 Server Production Environment
  15. 从零开始一起学习SLAM | 为啥需要李群与李代数?
  16. input 文本框,对中文长度校验
  17. 代码生成器 CodeSmith 的使用(三)
  18. 配置文件 .properties 的使用。
  19. Java知识系列 -- 反射
  20. 十.jQuery源码分析之.map()

热门文章

  1. [考试反思]1024csp-s模拟测试86:消耗
  2. CSPS模拟 62
  3. CSPS模拟 57
  4. NOIP模拟 38
  5. 从壹开始【NetCore3.0】 46 ║ 授权认证:自定义返回格式
  6. windows下同时装了Python3和Python2,如何区分使用?
  7. 【Leetcode 做题学算法周刊】第三期
  8. 什么是ping通
  9. Android Debug 之 Log 最佳实践
  10. BASH 编程之变量高级篇