PHPer欢乐的踩坑-运算

做开发嘛,一个是要开心,一个是要顺手。
最近咧搞财务系统比较多,我们聊点好玩的。。。
运算、比较
哈哈...开坑

示例一:

$a = '1.11';
$b = '0.11';
var_dump($a);//string(4) "1.11" 
var_dump($b);//string(4) "0.11" 
$re = $a - $b;
var_dump($re);//float(1)

示例二:

$a = '11';
$b = '1';
var_dump($a);//string(4) "11" 
var_dump($b);//string(4) "1" 
$re = $a - $b;
var_dump($re);//int(10)

结论:
1.在PHP底层运算的过程中,会自动进行类型转换,小数的转换成float,整数转换成int。
2.需要对数字有小数点后几位限制的,记得处理一下。number_format();

示例三:

var_dump(0123 == 123);  
var_dump('0123' == 123);  
var_dump('0123' === 123);

一方面是0开的头整形数字PHP底层会认为是八进制;另一方面是sting转换成int时会把前边的0去掉
var_dump(0123 == 123);// false,PHP会默认把0123当作8进制来处理,实际转化为10进制就是83,显然这不是相等的。
var_dump('0123' == 123);// true这里php会非常有趣的将’0123’转换成一个数字而且默认去掉了前面的0也就是123==123
var_dump('0123' === 123);// false很显然上面的问题已经说过了数字和字符串类型不一致。
结论:

  1. 0开头的整形数字PHP会当作八进制来处理
  2. 字符串在运算时会自动做类型转换,而且会把前边的0去掉

示例四:

下面$x的结果是多少?

$x = NULL;
if ('0xFF' == 255) {
   $x = (int)'0xFF';
}
$x = ?

注意点:
首先'oxFF' == 255我们好判断,会进行转换将16进制数字转换成10进制数字,0xff = 255。PHP使用is_numeric_string 判断字符串是否包含十六进制数字然后进行转换。
但是$x = (int)'0xFF';是否也会变成255呢?显然不是,将一个字符串进行强制类型转换实际上用的是convert_to_long,它实际上是将字符串从左向右进行转换,遇到非数字字符则停止。因此0xFF到x就停止了。所以$x=0

结论:

  1. 0开头的整形数字PHP会当作十六进制来处理
  2. string->int的过程,是将字符串从左向右进行转换,遇到非数字字符则停止。

示例五:

经过下面的运算 $x的值应该是多少?

$x = 3 + "15%" + "$25"

参考示例四的结论2

示例六:

这个是考虑运算符优先级的...

$a = true && false;
var_dump($a);
$a = true and false;
var_dump($a);

示例七:

$arr = array(0,1,2,3);
foreach ($arr as $key => $value) {}
  var_dump(current($arr));//最后指针停留在数组结尾,取不到值了输出false

  $arr = array(0,1,2,3);
  foreach ($arr as $key => $value) { 
  //$arr其实是进行了一次传值,用的是$arr_copy 
        $arr[$key] = $value;//进行了改值,则发生分离现象
}
var_dump(current($arr));//输出1

输出false 与 1;(PHP5.6环境下,php7已经做了修改);
那这个又是为什么呢?【和PHP内核有关,变量分离改变】

current() 函数返回数组中的当前元素的值。
每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素。
提示:该函数不会移动数组内部指针。要做到这一点,请使用 next() 和 prev() 函数。
相关的方法:
end() - 将内部指针指向数组中的最后一个元素,并输出
next() - 将内部指针指向数组中的下一个元素,并输出
prev() - 将内部指针指向数组中的上一个元素,并输出
reset() - 将内部指针指向数组中的第一个元素,并输出
each() - 返回当前元素的键名和键值,并将内部指针向前移动

最后修改时间为:2017 年 06 月 16 日 01 时 40 分 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论