PHP中“非”、“空”类型值使用empty()或感叹号取反的区别,以及使用isset()、strlen()的运算结果

2017-6-22 chuang_no1

“是”类型的值比较容易理解,“非”、“空”类型的绕一下容易晕,这里做一下总结。


PHP中有8种变量类型:整数、浮点、字符串、布尔、数组、对象、资源和NULL空,我们分别用empty()、isset()、strlen()测试一下,这里先把结果丢出来,有兴趣的可以看详细操作。


先看PHP自带的变量查看函数var_dump()打个基础,记下类型和值:

赋值方式$var=... var_dump($var)结果
0 int(0)
'0' string(1) "0"
0.0 float(0)
'0.0' string(3) "0.0"
FALSE bool(false)
'FALSE' string(5) "FALSE"
'' string(0) ""
' ' string(1) " "
array() array(0) { }
new Demo object(Demo)#1 (0) { }
NULL NULL
'NULL' string(4) "NULL"


然后是常用的判断方法结果:

赋值方式$var=... gettype($var)结果 !$var的结果 empty($var)结果 isset($var)结果 strlen($var)结果 print_r($var)输出
0 integer TRUE TRUE TRUE 1 0
'0' string TRUE TRUE TRUE 1 0
0.0 double TRUE TRUE TRUE 1 0
'0.0' string FALSE FALSE TRUE 3 0.0
FALSE boolean TRUE TRUE TRUE 0
'FALSE' string FALSE FALSE TRUE 5 FALSE
'' string TRUE TRUE TRUE 0
' ' string FALSE FALSE TRUE 1
array() array TRUE TRUE TRUE
Warning: strlen() expects parameter 1 to be string, array given in...
Array ( )
new Demo object FALSE FALSE TRUE
Warning: strlen() expects parameter 1 to be string, object given in...
Demo Object ( )
NULL NULL TRUE TRUE FALSE 0
'NULL' string FALSE FALSE TRUE 4 NULL


可见if(!$var)和empty($var)的结果是一样一样的,他们都是针对变量的值进行运算,if(empty($var))和if(!$var)可以互相代用,效率问题不在本文讨论范文内。而isset()是针对变量本身是否存在进行运算的,除了NULL之外,只要变量在内存中创建了,无论什么值,都认为存在。而strlen()只接受字符串类型变量,其他类型变量则会先尝试转换为字符串再判断,关于PHP中变量类型隐式转换请百度。strlen()转换失败则会抛出错误提示信息。


整数、浮点、布尔比较好理解,与自然思维一致;字符串类型只有一个特例,“0”作为字符串存在占用1个字节长度能被检测到,同时在判断时又会被隐式转换为“非”、“空”的含义;复合变量中,数组如果没有元素,则也认为是“非”“空”结果;而对于对象来说,与数组又有些区别,只要创建了,即使没有任何方法和属性,也认为是“真”“是”类型的值。最后一个特殊类型NULL,没有值,或者认为它的值就是本身,任何情况下,进行运算时,都认为它是真正的“空”和“不存在”的。


也就是说,变量不仅仅需要关注其值,还要关注其类型,类型+值才是一个完整的变量。在使用等号运算时,如果只需要判断值相等或不等,使用“==”和“!=”,而需要值和类型都相等或都不等时,使用恒等符号“===”和“!==”。如果不关注值,只比较类型,则需要这样:if(gettype($var1)==gettype($var2))...


脚本代码:


<?php
//空类
class Demo{}

//建立各种类型变量数组,下标为了方便显示做了一些转义
$datas = array(

	'0'=>0,	//整数零
	'\'0\''=>'0',	//字符串零
	
	'0.0'=>0.0,	//浮点零点零
	'\'0.0\''=>'0.0',	//字符串零点零
	
	'FALSE'=>FALSE,	//布尔非
	'\'FALSE\''=>'FALSE',	//字符串非
	
	'\'\''=>'',	//空字符串
	'\' \''=>' ',	//空格
	
	'array()'=>array(),	//空数组
	
	'new Demo'=>new Demo,	//空对象
	
	'NULL'=>NULL,	//NULL空
	'\'NULL\''=>'NULL'	//字符串NULL
	
	//资源类型略,创建成功后一定为真,创建失败时即时返回布尔值FALSE或Exception类对象
	
);

//PHP中直接ECHO布尔值,会输出数字1和空字符串,所以这里用一个函数显式指定为TRUE和FALSE
function echoBoolen($boolen){
	if(is_bool($boolen)){
		if($boolen===TRUE){
			echo 'TRUE';
		}elseif($boolen===FALSE){
			echo 'FALSE';
		}
	}else{
		echo '警告:这不是布尔类型。';
	}
}

//循环输出var_dump()结果
foreach($datas as $key=>$value){
	echo '<tr><td>';
		echo $key;
	echo '</td><td>';
		var_dump($value);
	echo '</td></tr>'.PHP_EOL;
}

//循环输出常用判定方式的结果
foreach($datas as $key=>$value){
	echo '<tr><td>';
		echo $key;
	echo '</td><td>';
		echo gettype($value);
	echo '</td><td>';
		echoBoolen(!$value);
	echo '</td><td>';
		echoBoolen(empty($value));
	echo '</td><td>';
		echoBoolen(isset($value));
	echo '</td><td>';
		echo strlen($value);
	echo '</td><td>';
		print_r($value);
	echo '</td></tr>'.PHP_EOL;
}
?>


评论(0) 浏览(1842)

关于为什么switch case语句不加break会继续执行不满足条件语句的坑与解释

2017-6-21 chuang_no1

遇到一个有点莫名的问题,看下代码:


<?php
$a = 0;
switch($a){
  case 0:
    $b='张三';
  case 1:
    $c='李四';
}
echo $b;
echo $c;

//执行结果为张三李四
?>


是不是很奇怪?明明$a=0时并不满足case 1,为什么会执行$c=1?

实际上,switch case语句的原理是:跳转到第一个满足case XX的条件,并执行剩余的语句(无论条件是否满足),直到执行完毕或遇到break/exit/die()/return等中断语句结束。

所以上面例子中,如果$a=1,则执行结果会是李四。如果希望执行到满足条件后不再执行,可以添加break;


<?php
$a = 0;
switch($a){
  case 0:
    $b='张三';
    break;
  case 1:
    $c='李四';
    break;
}
echo $b;
echo $c;

//执行结果为张三
?>


评论(0) 浏览(1290)

Powered by emlog 沪ICP备13034247号-2