php类型转换以及类型转换的判别

部分摘自PHP: 类型 - Manual

相关链接

PHP 在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个 string 值赋给变量 $var,$var 就成了一个 string。如果又把一个integer 赋给 $var,那它就成了一个integer。

PHP 的自动类型转换的一个例子是加法运算符“+”。如果任何一个操作数是float,则所有的操作数都被当成float,结果也是float。否则操作数会被解释为integer,结果也是integer。注意这并没有改变这些操作数本身的类型;改变的仅是这些操作数如何被求值以及表达式本身的类型。

PHP允许的强制转换

(int), (integer) - 转换为整形 integer
(bool), (boolean) - 转换为布尔类型 boolean
(float), (double), (real) - 转换为浮点型 float
(string) - 转换为字符串 string
(array) - 转换为数组 array
(object) - 转换为对象 object
(unset) - 转换为 NULL (PHP 5)

字符串转为数值

如果该字符串没有包含 ‘.‘,‘e‘ 或 ‘E‘ 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。

该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 ‘e‘ 或 ‘E‘ 后面跟着一个或多个数字构成。

 1 <?php
 2 $sSeparate = "\t";
 3 echo ‘结果‘,$sSeparate,‘类型‘,"\n";
 4 $mFoo = 1 + ‘10.5‘;
 5 echo $mFoo,$sSeparate,getType($mFoo),"\n";
 6
 7 $mFoo = 1 + ‘10‘;
 8 echo $mFoo,$sSeparate,getType($mFoo),"\n";
 9
10 $mFoo = 1 + ‘-1.3e3‘;
11 echo $mFoo,$sSeparate,getType($mFoo),"\n";
12
13 $mFoo = 1 + ‘hello‘;
14 echo $mFoo,$sSeparate,getType($mFoo),"\n";
15
16 $mFoo = 1 + ‘99hello‘;
17 echo $mFoo,$sSeparate,getType($mFoo),"\n";
18
19 $mFoo = 1 + ‘99.90hello‘;
20 echo $mFoo,$sSeparate,getType($mFoo),"\n";
21 ?>
22 结果    类型
23 11.5    double
24 11       integer
25 -1299  double
26 1         integer
27 100     integer
28 100.9  double

转为整型

要明确地将一个值转换为 integer,用 (int) 或 (integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。还可以通过函数 intval() 来将一个值转换成整型。

从布尔值转换

FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。

从浮点型转换

当从浮点数转换成整数时,将向下取整。

转为字符串型

一个值可以通过在其前面加上 (string) 或用 strval() 函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。类型和类型转换可以更好的解释下面的事情,也可参考函数 settype()。

一个布尔值 boolean 的 TRUE 被转换成 string 的 "1"。Boolean 的 FALSE 被转换成 ""(空字符串)。这种转换可以在 boolean 和 string 之间相互进行。

一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float 中的指数部分)。使用指数计数法的浮点数(4.1E+6)也可转换。

Note:
在脚本的区域(category LC_NUMERIC)中定义了十进制小数点字符。参见 setlocale()。
数组 array 总是转换成字符串 "Array",因此,echo 和 print 无法显示出该数组的内容。要显示某个单元,可以用 echo $arr[‘foo‘] 这种结构。要显示整个数组内容见下文。

在 PHP 4 中对象 object 总是被转换成字符串 "Object"。

资源 resource 总会被转变成 "Resource id #1" 这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。不要依赖此结构,可能会有变更。要得到一个 resource 的类型,可以用函数 get_resource_type()。

NULL 总是被转变成空字符串。

如上面所说的,直接把 array,object 或 resource 转换成 string 不会得到除了其类型之外的任何有用信息。可以使用函数 print_r() 和 var_dump() 列出这些类型的内容。

1 <?php
2 var_dump(strval(10));       #string(2) "10"
3 var_dump(strval(FALSE));    #string(0) ""
4 var_dump(strval(true));     #string(1) "1"
5 var_dump(strval(100.09));   #string(6) "100.09"
6 var_dump(strval(NULL));     #string(0) ""
7 ?>

转为数组型

对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValue 与 array($scalarValue) 完全一样。

如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*‘ 做前缀。这些前缀的前后都各有一个 NULL 字符。

NULL为空数组

 1 <?php
 2 print_r((array)10);
 3 /*
 4 Array
 5 (
 6     [0] => 10
 7 )
 8 */
 9 print_r((array)100.09);
10 /*
11 Array
12 (
13     [0] => 100.09
14 )
15 */
16
17 print_r((array)0);
18 /*
19 Array
20 (
21     [0] => 0
22 )
23 */
24 print_r((array)-10);
25 /*
26 Array
27 (
28     [0] => -10
29 )
30 */
31 print_r((array)‘string‘);
32 /*
33 Array
34 (
35     [0] => string
36 )
37 */
38 print_r((array)‘0‘);
39 /*
40 Array
41 (
42     [0] => 0
43 )
44 */
45 print_r((array)true);
46 /*
47 Array
48 (
49     [0] => 1
50 )
51 */
52 print_r((array)FALSE);
53 /*
54 Array
55 (
56     [0] =>
57 )
58 */
59 print_r((array)NULL);
60 /*
61 Array
62 (
63 )
64  */
65
66 class A
67 {
68     private $_A = ‘A‘;  #私有
69     protected $B;   #受保护的
70 }
71
72 class B extends A
73 {
74     public $C;      #公有
75     public function __construct()
76     {
77         $this->B = ‘B‘;
78         $this->C = ‘C‘;
79     }
80 }
81 print_r((array) new B());
82 /*
83 Array
84 (
85     [C] => C
86     [A_A] => A,私有变量前面会加上类名作为前缀
87     [*B] => B,受保护变量回家上*作为前缀
88 )
89 */
90 ?>

转为布尔型

要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。

 1 <?php
 2 /**
 3  * 当转换为 boolean 时,以下值被认为是 FALSE:
 4  * 布尔值 FALSE 本身
 5  * 整型值 0(零)
 6  * 浮点型值 0.0(零)
 7  * 空字符串,以及字符串 "0"
 8  * 不包括任何元素的数组
 9  * 不包括任何成员变量的对象(仅 PHP 4.0 适用)
10  * 特殊类型 NULL(包括尚未赋值的变量)
11  * 从空标记生成的 SimpleXML 对象
12  **/
13 var_dump(FALSE);                        #bool(false)
14 var_dump((boolean)‘‘);                  #bool(false)
15 var_dump((boolean)‘string‘);            #bool(true)
16 var_dump((boolean)‘0‘);                 #bool(false)
17 var_dump((boolean)1);                   #bool(true)
18 var_dump((boolean)1.0);                 #bool(true)
19 var_dump((boolean)-1);                  #bool(true)
20 var_dump((boolean)0);                   #bool(false)
21 var_dump((boolean)2.2e5);               #bool(true)
22 var_dump((boolean)array(‘one‘,‘two‘));  #bool(true)
23 var_dump((boolean)array());             #bool(false)
24 $sTest = ‘test‘;
25 unset($sTest);
26 var_dump((boolean)$sTest);              #bool(false)
27 var_dump((boolean)null);                #bool(false)
28 var_dump((boolean)$sNotDefined);        #bool(false)
29 ?>
使用 PHP 函数对变量 $x 进行比较
表达式 gettype() empty() is_null() isset() boolean : if($x)
$x = ""; string TRUE FALSE TRUE FALSE
$x = null; NULL TRUE TRUE FALSE FALSE
var $x; NULL TRUE TRUE FALSE FALSE
$x is undefined NULL TRUE TRUE FALSE FALSE
$x = array(); array TRUE FALSE TRUE FALSE
$x = false; boolean TRUE FALSE TRUE FALSE
$x = true; boolean FALSE FALSE TRUE TRUE
$x = 1; integer FALSE FALSE TRUE TRUE
$x = 42; integer FALSE FALSE TRUE TRUE
$x = 0; integer TRUE FALSE TRUE FALSE
$x = -1; integer FALSE FALSE TRUE TRUE
$x = "1"; string FALSE FALSE TRUE TRUE
$x = "0"; string TRUE FALSE TRUE FALSE
$x = "-1"; string FALSE FALSE TRUE TRUE
$x = "php"; string FALSE FALSE TRUE TRUE
$x = "true"; string FALSE FALSE TRUE TRUE
$x = "false"; string FALSE FALSE TRUE TRUE
时间: 2024-10-10 06:11:16

php类型转换以及类型转换的判别的相关文章

Go语言的基本类型转换-golang类型转换

简单整理一下Golang的基本类型转换,作为备忘: 1.整形到字符串: var i int = 1 var s string 3.  s = strconv.Itoa(i) 或者 s = FormatInt(int64(i), 10) 2.字符串到整形 var s string = "1" var i int i, err = strconv.Atoi(s) 或者 i, err = ParseInt(s, 10, 0) 3.字符串到float(32 / 64) var s string

C语言数据类型转换

变量的数据类型是可以转换的.转换的方法有两种,一种是自动转换,一种是强制转换. 自动转换 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成.自动转换遵循以下规则: 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 转换按数据长度增加的方向进行,以保证精度不降低.如int型和long型运算时,先把int量转成long型后再进行运算. 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算. char型和short型参与运

关于Java中的基本数据类型转换

Java中的基本类型有四种,其中整型分为byte.short.int.long,浮点型分为float.double,字符型char,布尔型boolean.8种类型的级别由低到高byte->short/char->int->long->float->double. Java中的基本数据类型转换分为隐式类型转换(自动类型转换)和显式类型转换(强制类型转换). 隐式类型转换是将一个较低级别的值或变量赋给一个较高级别的变量,在这种情况下,Java会自动地将较低级别的变量或值转换成与较

c 中的类型转换

1. c 中的类型转换是临时对变量值的转换,一般分为: 强制类型转换,自动类型转换.自动转换中一般遵守无论表达式的值是什么样的,系统都自动将其 转换为赋值运算符左边变量的类型. 2. 当 int 赋给char 时,将int 保留低 8 位赋给 char 型变量.当 long 赋给 int 时,将 long 的低16 位保留赋给 int 型变量.

c++的四种类型转换

C++中四种类型转换方式 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些.还有一个缺点就是,c风格的转换不容易查找,他由一个括号加上一个标识符组成

【类型转换】 隐式转换 自动提升 强制转换

基本数据类型的类型转换 Java中基本数据类型共有8种,分别是:布尔型boolean,字符型char和数值型byte/short/int/long/float/double.由于字符型char所表示的单个字符与Ascii码中相应整形对应,因此,有时也将其划分到数值型中. 基本数据类型中,布尔类型boolean占有一个字节,由于其本身所代表的特殊含义,boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错. 数值类型在内存中直接存储其

JavaScript3基础——运算符和类型转换

JavaScript3基础--运算符和类型转换    JavaScript运算符    JavaScript运算符也称操作符.其作用是对目标数据进行运算操作. 基本数学运算符    + - * / %  分别为加,减,乘,除,求模(求余数)    加减乘除不再赘述,此处解释一下求模    eg: var a = 10%20  //10    eg: var a = 15%4   //3    求模运算较为常见的地方在于处理时间.    如下 199秒换算为几分几秒.    199/60 为分钟数

Java基本数据类型转换

类型转换 Java 语言是一种强类型的语言.强类型的语言有以下几个要求: 变量或常量必须有类型:要求声明变量或常量时必须声明类型,而且只能在声明以后才能使用. 赋值时类型必须一致:值的类型必须和变量或常量的类型完全一致. 运算时类型必须一致:参与运算的数据类型必须一致才能运算. 但是在实际的使用中,经常需要在不同类型的值之间进行操作,这就需要一种新的语法来适应这种需要,这个语法就是数据类型转换.在数值处理这部分,计算机和现实的逻辑不太一样,对于现实来说,1和 1.0 没有什么区别,但是对于计算机

14.类的基本定义,类型推断、安全和类型转换

/* 类的基本定义 Swift中的结构体和类非常相似, 但是又有不同之处 类是具有相同属性和方法的抽象 格式: class 类名称 { 类的属性和方法 } */ class Rect { var width:Double = 0.0 var height:Double = 0.0 func show() -> Void{ print("width = \(width) height = \(height)") } } // 类没有逐一构造器 //var r1 = Rect(wid