部分摘自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' 后面跟着一个或多个数字构成。

 <?php
$sSeparate = "\t";
echo '结果',$sSeparate,'类型',"\n";
$mFoo = 1 + '10.5';
echo $mFoo,$sSeparate,getType($mFoo),"\n"; $mFoo = 1 + '10';
echo $mFoo,$sSeparate,getType($mFoo),"\n"; $mFoo = 1 + '-1.3e3';
echo $mFoo,$sSeparate,getType($mFoo),"\n"; $mFoo = 1 + 'hello';
echo $mFoo,$sSeparate,getType($mFoo),"\n"; $mFoo = 1 + '99hello';
echo $mFoo,$sSeparate,getType($mFoo),"\n"; $mFoo = 1 + '99.90hello';
echo $mFoo,$sSeparate,getType($mFoo),"\n";
?>
结果 类型
11.5 double
11 integer
-1299 double
1 integer
100 integer
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() 列出这些类型的内容。

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

转为数组型

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

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

NULL为空数组

 <?php
print_r((array)10);
/*
Array
(
[0] => 10
)
*/
print_r((array)100.09);
/*
Array
(
[0] => 100.09
)
*/ print_r((array)0);
/*
Array
(
[0] => 0
)
*/
print_r((array)-10);
/*
Array
(
[0] => -10
)
*/
print_r((array)'string');
/*
Array
(
[0] => string
)
*/
print_r((array)'0');
/*
Array
(
[0] => 0
)
*/
print_r((array)true);
/*
Array
(
[0] => 1
)
*/
print_r((array)FALSE);
/*
Array
(
[0] =>
)
*/
print_r((array)NULL);
/*
Array
(
)
*/ class A
{
private $_A = 'A'; #私有
protected $B; #受保护的
} class B extends A
{
public $C; #公有
public function __construct()
{
$this->B = 'B';
$this->C = 'C';
}
}
print_r((array) new B());
/*
Array
(
[C] => C
[A_A] => A,私有变量前面会加上类名作为前缀
[*B] => B,受保护变量回家上*作为前缀
)
*/
?>

转为布尔型

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

 <?php
/**
* 当转换为 boolean 时,以下值被认为是 FALSE:
* 布尔值 FALSE 本身
* 整型值 0(零)
* 浮点型值 0.0(零)
* 空字符串,以及字符串 "0"
* 不包括任何元素的数组
* 不包括任何成员变量的对象(仅 PHP 4.0 适用)
* 特殊类型 NULL(包括尚未赋值的变量)
* 从空标记生成的 SimpleXML 对象
**/
var_dump(FALSE); #bool(false)
var_dump((boolean)''); #bool(false)
var_dump((boolean)'string'); #bool(true)
var_dump((boolean)'0'); #bool(false)
var_dump((boolean)1); #bool(true)
var_dump((boolean)1.0); #bool(true)
var_dump((boolean)-1); #bool(true)
var_dump((boolean)0); #bool(false)
var_dump((boolean)2.2e5); #bool(true)
var_dump((boolean)array('one','two')); #bool(true)
var_dump((boolean)array()); #bool(false)
$sTest = 'test';
unset($sTest);
var_dump((boolean)$sTest); #bool(false)
var_dump((boolean)null); #bool(false)
var_dump((boolean)$sNotDefined); #bool(false)
?>
使用 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

对null的判断

 <?php
$a;
$b = null;
$c = 'null';
_is_null($a);
_is_null($b);
_is_null($c);
function _is_null($var)
{
echo '$var == null , ',var_dump($var == null).PHP_EOL;
echo '$var == \'null\' , ',var_dump($var == 'null').PHP_EOL;
echo 'is_null($var) , ',var_dump(is_null($var)).PHP_EOL;
echo '-------------------------------------'.PHP_EOL;
}
?>
$var == null , bool(true) $var == 'null' , bool(false) is_null($var) , bool(true) -------------------------------------
$var == null , bool(true) $var == 'null' , bool(false) is_null($var) , bool(true) -------------------------------------
$var == null , bool(false) $var == 'null' , bool(true) is_null($var) , bool(false) -------------------------------------

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

  1. C++类型转换(类型转换函数+类型构造函数)

    C++类型转换(类型转换函数+类型构造函数) 类型转换函数 类型转换运算符是类的一种特殊成员函数,它负责将一个类类型的值转换成其他类型. graph LR 类类型--> 类型转换函数 --> ...

  2. C++ Primer : : 第十四章 : 重载运算符与类型转换之类型转换运算符和重载匹配

    类型转换运算符 class SmallInt { public: SmallInt(int i = 0) : val(i) { if (i < 0 || i > 255) throw st ...

  3. Struts(十九):类型转换、类型转换错误消息及显示

    类型转换概念 1.从html表单页面到一个Action对象,类型转化是从字符串到一个非字符串:html并没有“类型”的概念,每个表单输入的信息都只可能是一个字符串或者一个字符串数组,但是在服务器端,必 ...

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

    简单整理一下Golang的基本类型转换,作为备忘: 1.整形到字符串: var i int = 1 var s string 3.  s = strconv.Itoa(i) 或者 s = Format ...

  5. day3:强制类型转换&自动类型转换&变量缓存机制

    1.Number的强制类型转换(int,float,bool,complex) 1.int 强制转换成整形 float可以转化成int bool可以转化成int str(形如"123&quo ...

  6. C++类型转换函数

    1.什么是类型转换函数 类型转换函数的作用是将一个类的对象转换成另一类型的数据. class testclass { private: int r; int m; public : testclass ...

  7. go:interface{}、断言与类型转换

    interface{}可用于向函数传递任意类型的变量,但对于函数内部,该变量仍然为interface{}类型(空接口类型), 不清楚这点将可能导致错误.如以下代码: package main impo ...

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

    Java中的基本类型有四种,其中整型分为byte.short.int.long,浮点型分为float.double,字符型char,布尔型boolean.8种类型的级别由低到高byte->sho ...

  9. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

随机推荐

  1. JS浏览器全屏

    //全屏 function fullScreen() { var el = document.documentElement; var rfs = el.requestFullScreen || el ...

  2. jQuery的事件click

    不管是在asp.net 还是asp.net mvc中,对象的click事件是我们最常用到的一个事件,说明用户click点击一下mouse的左键,铵下并放开的事件. 今天已经是十一月份了,学习又是新的开 ...

  3. javascript运算符的优先级

    最基木的运算符优先级就是所谓的“先乘除,后加减”.对于优先顺序处于同一层次上的运算符,按照从左到右出现的顺序计算.下面给出javascript定义的所有运算符的优先级.运算符 优先顺序成员选择.括号. ...

  4. 剑指offer面试题31连续子数组的最大和

    一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果 ...

  5. 在一个未知的CentOS服务器中如何加上PHP的openssl扩展

    1. 服务器是定制过的,不知对应的centos版本: 2. PHP是自己编译的,而且服务器上没有保留对应版本的源代码,通过/pathto/php -v 找出php版本号,然后wget去下载对应的php ...

  6. (旧)子数涵数·C语言——让C帮你做计算

    之前,我们学过了我们的第一个C程序--hello World.现在开始进一步学习,想一想如何让C帮你做计算. 我们先来看代码(我没有新建,还是用之前的hello world.cpp): 好,因为之前在 ...

  7. mysql innodb表 utf8 gbk占用空间相同,毁三观

    昨天因为发生字符集转换相关错误,今天想验证下utf8和gbk中英文下各自空间的差距.这一测试,绝对毁三观,无论中文还是中文+英文,gbk和utf8占用的实际物理大小完全相同,根本不是理论上所述的“UT ...

  8. 设计模式之Builder (创建者模式)的一些个人理解(转)

    对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程的Director要.刚才google到一篇文章,总算清楚了.在这里转贴一下 ...

  9. Linux 学习手记(4):Linux系统常用Shell命令

    日期时间 date命令:显示当前时间日期 date -u # 显示格林威治(UTC)事件 date +%Y-%m-%d # 格式显示日期 date -s '20:25:25' # 修改系统时间,需要使 ...

  10. [ html canvas 模仿支付宝刮刮卡效果 ] canvas绘图属性 模仿支付宝刮刮卡效果实例演示

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...