在V2EX上面看到这个帖子
echo
作用的对象是一个字符串,那么对于echo "1+5=". 5+1;
就可以这样来看:
$var = "1+5=" . 5 + 1;
echo $var;
这就涉及到了字符串转数值类型的问题,可以看官方手册里面的说法
下面用几个例子来说明:
$var = "1.0" + 1;
var_dump($var);
$var = "1.nemo" + 1;
var_dump($var);
$var = '11' + 1;
var_dump($var);
$var = '1nemo' + 1;
var_dump($var);
$var = 'nemo' + 1;
var_dump($var);
结果是
float(2)
float(2)
int(12)
int(2)
int(0)
第一个字符串里面包括了小数点.
,所以这个字符串被当成了float。而且它还是一个合法的数值,所以结果是float(2)
。
第二个字符串里面包括了小数点.
,所以这个字符串被当成了float来取值。但它不是一个合法的数值,看它的开头,1
是一个数值,所以这个字符串转换成数值就是1,以结果是float(2)
。
第三个字符串里面没有小数点.
,没有e
,E
,所以被当成了int。而且它还是一个合法的数值,所以结果是int(12)
。
第四个字符串里面没有小数点.
,没有e
,E
,所以被当成了int。但它不是一个合法的数值,看它的开头,1
是一个数值,所以结果是int(12)
。
第五个字符串里面没有小数点.
,没有e
,E
,所以被当成了int。但它不是一个合法的数值,看它的开头,是不合法的数值,所以结果是int(0)
.
所以V2EX里面的这个$var = "1+5=" . 5 + 1;
,其实关键就在于"1+5=" . 5
这个字符串转换成数值,"1+5=" . 5
转换成了int(1)
,所以var_dump($var)的结果就是int(2)
,然后再被echo出来。
后面的几个"1+5=". 1+5;
,"5+1=". 5+1;
,"5+1=". 1+5
也都好解释了。
出现这个的最根本的原因是php里面不需要声明变量的类型,它会根据变量的值自动判断类型。再来说说类型转换
里面的一些其他内容
强制类型转换
也就是在表达式前面加上(目标类型)
,有以下几种形式
- (int), (integer) - 转换为整形 integer
- (bool), (boolean) - 转换为布尔类型 boolean
- (float), (double), (real) - 转换为浮点型 float
- (string) - 转换为字符串 string
- (array) - 转换为数组 array
- (object) - 转换为对象 object
- (unset) - 转换为 NULL (PHP 5)
- (binary) 转换和 b 前缀转换支持为 PHP 5.2.1 新增。
下面来看几个例子
例1: 字符串强制类型转换为int
// 字符串强制类型转换为int
$var = (int)'123';
var_dump($var);
$var = (int)'1.23';
var_dump($var);
$var = (int)'1nemo';
var_dump($var);
$var = (int)'1.23nemo';
var_dump($var);
$var = (int)'nemo123';
var_dump($var);
结果是
int(123)
int(1)
int(1)
int(1)
int(0)
例2:字符串强制类型转换为float
// 字符串强制类型转换为float
$var = (float)'123';
var_dump($var);
$var = (float)'1.23';
var_dump($var);
$var = (float)'1nemo';
var_dump($var);
$var = (float)'1.23nemo';
var_dump($var);
$var = (float)'nemo1.23';
var_dump($var);
结果是
float(123)
float(1.23)
float(1)
float(1.23)
float(0)
例3:强制转换成bool
$var = (bool)'123';
var_dump($var);
$var = (bool)'1.23';
var_dump($var);
$var = (bool)'0';
var_dump($var);
$var = (bool)'';
var_dump($var);
$var = (bool)null;
var_dump($var);
$var = (bool)'0.0';
var_dump($var);
$var = (bool)0.0;
var_dump($var);
$var = (bool)1.23;
var_dump($var);
$var = (bool)array();
var_dump($var);
结果是
bool(true)
bool(true)
bool(false)
bool(false)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
看一下手册里面是怎么说关于bool类型的转换的:
当转换为 boolean
时,以下值被认为是 FALSE
:
- 布尔值 FALSE 本身
- 整型值 0(零)
- 浮点型值 0.0(零)
- 空字符串,以及字符串 "0"
- 不包括任何元素的数组
- 特殊类型 NULL(包括尚未赋值的变量)
- 从空标记生成的 SimpleXML 对象
例4:强制转换成string
可以通过在变量前面加上(string)
或者使用strval()
函数来变成字符串。
$var = (string)0;
var_dump($var);
$var = (string)null;
var_dump($var);
$var = (string)0.0;
var_dump($var);
$var = (string)FALSE;
var_dump($var);
$var = (string)TRUE;
var_dump($var);
$var = (string)array();
var_dump($var);
结果是
string(1) "0"
string(0) ""
string(1) "0"
string(0) ""
string(1) "1"
string(5) "Array"
可以看到int和float都转换成字面样式的string, 而 TRUE
被转换成"1"
,FALSE
被转换成""
空字符串,
数组转换成了字符串"Array"
, NULL
被转换成了""
空字符串。
还有一些其他的类型转换的注意点,这里就不列出来了。
就像帖子下面的回复一样,这种是不符合代码规范的,但如果真的遇到了,就去查手册。╮( ̄▽ ̄)╭