由于 PHP 是弱类型语言,在声明变量的时候,可以不用指定该变量的数据类型,系统会自动判断该数据的类型,这是自动转换。而当我把一个已经声明好的变量前加上一个类型的时候,PHP 就会将该值转换为制定的数据类型,这是强制转换。接下来我将详细介绍这两种转换方式。该部分知识点一般都是面试题的考试要点,需要重点理解掌握哟

Automatic

自动转换

PHP 在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个文本型的值赋给变量 $var$var 就成了一个 string。如果又把一个整型值赋给 $var,那它就成了一个integer。同样,在 PHP 中,如果数据之间想要进行运算,首先要满足两者类型相同的条件才能进行操作。若两者数据类型不相同,PHP 就会自动将类型转换一致。通常只有四种标量类型(整数、浮点、字符串和布尔型)可以进行自动的类型转换。它们之间的可转换关系如下:

PHP 数据之间的类型转换

根据图示,我们可以总结出以下几点:

  1. 有布尔值参与运算时,TRUE 将转换为整型 1;FALSE 将转换为整型 0 后参与运算。
  2. NULL 值将转换为整型 0。
  3. 有 integer 和 float 值混合运算时,系统会先把 integer 转换为 float。

当有字符串和数字型(integer 和 float)数据参与运算时,字符串会先转换为数字,再参与运算。转换后的数字是从字符串开始的数值型字符串,如果在字符串开始的数值型字符串不带小数点,则转换为 integer 型数字。反之会转换为 float 型数字。请看以下示例:


<?php

// 布尔变整型参与运算
$foo = true;
$res = $foo + 10;
// $res 结果为 integer 的 11,因为 $foo 布尔的 true 变为了1

// NULL 变整型参与运算
$foo = NULL;
$res = $foo + 10;
// $res 结果为 integer 的 10,因为 $foo 被转换为 0
// 如果 $foo = false 也会被当做 integer 的 0

// 声明一个带数字的字符串
$foo = '100wowphp';
$res_one = $foo + 1;
// foo 被转换为值为 100 的 integer 型,$res_one 结果为 101
$res_two = $foo + 2.333;
// foo 被转换为 float,$res_two 结果为 102.333
$res_thr = $foo + '10 Little Piggies';
// 被加数转换为 10,foo 被转换为 100,$res_thr 结果为 110
$res_fou = $foo + '3.1416 is pai';
// 被加数转换为 3.1416,foo 被转换为 100,$res_fou 结果为 103.1416

// 声明一个带小数的字符串
$foo = '9.28wowphp';
$res_fie = $foo + 1; // foo 被转换为值为 9.28 的 float 型,结果为 10.28
$res_six = $foo + 2.333; // foo 被转换为 float,结果为 11.613
// 以此类推...
        
force

强制转换

PHP 中的类型强制转换与其他语言类似,在要转换的变量名前加上用括号括起来的目标类型即可。也可以使用 PHP 自带的类型转换函数,它们分别是 intval()floatval()strval() 等,或是使用 setType() 函数转换类型。请看以下示例:

第一种:在变量名前加上目标类型


<?php
$wowphp = 10; // $wowphp is an integer
$bar    = (boolean) $wowphp; // $wowphp is a boolean
        

允许转换的类型都有以下几种:

在括号里允许使用空格或制表符,例如:$foo = (int) $bar;$foo = ( int ) $bar; 两者是等价的。

第二种:使用 PHP 内置函数转换

PHP 也为类型转换提供了几个内置函数供我们使用,他们分别是上文提及的: intval()floatval()strval() 等;使用方法参见以下示例:


<?php   
$str   = "123.9abc";   
$int   = intval($str);    //转换后数值:123   
$float = floatval($str);  //转换后数值:123.9   
$str   = strval($float);  //转换后字符串:"123.9" 
        

以上两种类型都没有改变原有变量的类型,而是通过转换,将转换后的值赋给了新的变量。如果你想改变原有变量的类型,就可以参考下面的第三种转换方法:

第三种:使用 setType() 函数转换


<?php   
$num = 12.8;   
$flg = settype($num,"int");   
var_dump($flg);  //输出 bool(true)   
var_dump($num);  //输出 int(12)   
        

一些小细节

整数转化为浮点型,由于浮点型的精度范围远大于整型,所以转化后的精度不会改变。浮点型转化为整型,将会自动舍弃小数部分,只保留整数部分。如果一个浮点数超过整型数字的有效范围,其结果将是不确定的。整型的最大值约是 2.147e9。当字符串转化为数字时,转化后的数字是从字符串开始部分的数值型字符串,数值型字符串包括用科学计数法表示的数字。NULL值转为字符串,为空字符 ""。

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~