Chinaunix首页 | 论坛 | 博客
  • 博客访问: 213826
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-09 10:55
个人简介

每天改变一点点,生活充满了惊喜。

文章分类

全部博文(42)

文章存档

2016年(8)

2015年(29)

2014年(5)

我的朋友

分类: PHP

2015-07-07 18:23:32

PHP属于松散类型语言,脚本语言大多有此特性,是为了增加语言的灵活性,
但代码如果不够严谨,对语言中的类型转换如果不够了解,就容易出现bug。
本文希望对PHP中的一些类型转换机制做一些Collection。

类型转换规则

1. string 转换成 int,空字符串返回 0,非空返回字符串开头的整型部分,不以整型开头返回 0。(开头可以有正负号);
    bool 转换为 int,false 返回 0, true 返回 1;
    float 转换为 int,向下取整;
    其他类型转换为int,未定义,所以不要依赖现有实现。
    string 转化为 float,类似 转换为int,返回字符串开头浮点部分,可以包含正负号,以及可以使用科学计算法。
2. int, float 转换成 string,按照字面转换,4.1E+6 会转为 "4100000";
    bool 转换成 string,false 转为 "0" , true 转为 "1";
    null 转换成 string,转为 ""; 
    object 转为 string,返回 "Object"。
3. 转换为 bool 类型,以下值返回false:
    null(包括未赋值变量),int 的 0,float 的 0,string 的空字符串 和 "0",array 的空数组,不包含任何成员变量的object。
4. 转为 null, (unset) $var 将一个变量转换为 null,将不会删除该变量或 unset 其值,仅返回 NULL 值而已。
5. integer,float,string,boolean 和 resource 类型转换为数组,将得到仅有一个元素的数组,下标为 0,值为此标量的值,即 (array)$var 与 array($var) 完全一样。
    null 转为数组,返回空数组;
    object 转换为 array,(array) $obj 返回数组,其元素为该对象的成员变量,键名将为变量名,键值是变量值。
    类常量和静态成员变量不返回(属于类),私有变量前会加上类名作前缀,保护变量前会加上一个 '*' 做前缀,前缀的前后都各有一个 null('\0')字符。
6. array 转换成 number,返回数组元素个数;

    array 转换成 bool,返回数组中是否有元素

    array 转换成 string,返回 'Array',并报WARNING 日志。

类型转换场景
1. 数组键值类型的转换
  1. <?php
  2. $arr = array(
  3.     '1.1' => 1,
  4.     '2' => '2',
  5.     '-1' => 3,
  6. );

  7. foreach ($arr as $key => $value){
  8.     var_dump($key);
  9. }
以上代码输出:
string(3) "1.1"
int(2)
int(-1)
实际上是数组在存储时,对键值做了转换(array的键值只可以是string或int):
(1)包含有合法整型值的字符串会被转换为整型。
(2)浮点数也会被转换为整型,意味着其小数部分会被舍去。
(3)布尔值也会被转换成整型。
(4)null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
(5)数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
我们再编码的时候要尽量非整型或字符串作为键值,以防止造成不确定性。
不过对于第一点的默认转换,还是要引起注意,可能造成不是你想要的结果。

2. 相等比较时的类型转换
  1. # php -r "var_dump('str' == 0);"
  2. bool(true)
在做比较之前,PHP将字符串转换成了整型:
  1. $ php -r "var_dump(intval('str'));"
  2. int(0)
(1)string 与 number 比较,string转换为number;
        比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。
        此规则也适用于 switch 语句。
(2)bool 与 其它类型比较,转换为 bool,false < true;
(3)null 与 string 或 number 比较,null被转换为空字符串或0,再进行字符串或数值比较。

3. 采用字符串偏移访问字符串中的字符时,对偏移量的类型转换
  1. $ php -r '$str = "sunny chan"; var_dump($str['any']);'
  2. string(1) "s"
  3. $ php -r '$str = "sunny chan"; var_dump($str['1']);'
  4. string(1) "u"
采用偏移方式访问字符串中字符时,字符串类型的偏移将会转换成数值类型,非数值特征的字符串将被转换成0。
注意和数组的访问做区分:
$php -r '$arr = array("sunny chan"); var_dump($arr['any']);'
NULL
因为数组本身是提供字符串作为键值(关联数组)的访问机制。

阅读(1663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~