在V2EX上面看到这个帖子

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被转换成了""空字符串。

还有一些其他的类型转换的注意点,这里就不列出来了。

就像帖子下面的回复一样,这种是不符合代码规范的,但如果真的遇到了,就去查手册。╮( ̄▽ ̄)╭