PHP好讨厌的弱类型:在为空(null,0,false等)时的处理方案

szuzsq 2017-08-28 02:21:14
当为空(null、false、0、0.0、''、'null'、'false'、'0'、'0.0')时,它们之间的判断,太混乱了.
如果是null、false、0、0.0、''这5个,它们之间全表示为空,这都还好理解;
'null'、'false'、'0'、'0.0'这4个有时为空,有时不为空,这就找不到它们之间的规律了.感觉php的设计者都没有拎清啊.
以下是我写代码测试的.(注:后面其实是JS的判断条件)



//-------------------------------------------------------------------------------------PHP---------------------JS--
if('' == '') echo "a1: 11111111111111<br>"; //--------------------成立--------------------成立
if('' == 'null') echo "a1: 22222222222222<br>";
if('' == 'false') echo "a1: 33333333333333<br>";
if('' == '0') echo "a1: 44444444444444<br>";
if('' == '0.0') echo "a1: 55555555555555<br>";
if('' == null) echo "a1: 66666666666666<br>"; //--------------------成立
if('' == false) echo "a1: 77777777777777<br>"; //--------------------成立--------------------成立
if('' == 0) echo "a1: 88888888888888<br>"; //--------------------成立--------------------成立
if('' == 0.0) echo "a1: 99999999999999<br>"; //--------------------成立--------------------成立
echo "<br><br>";


if('null' == '') echo "a2: 11111111111111<br>";
if('null' == 'null') echo "a2: 22222222222222<br>"; //--------------------成立--------------------成立
if('null' == 'false') echo "a2: 33333333333333<br>";
if('null' == '0') echo "a2: 44444444444444<br>";
if('null' == '0.0') echo "a2: 55555555555555<br>";
if('null' == null) echo "a2: 66666666666666<br>";
if('null' == false) echo "a2: 77777777777777<br>";
if('null' == 0) echo "a2: 88888888888888<br>"; //--------------------成立
if('null' == 0.0) echo "a2: 99999999999999<br>"; //--------------------成立
echo "<br><br>";


if('false' == '') echo "a3: 11111111111111<br>";
if('false' == 'null') echo "a3: 22222222222222<br>";
if('false' == 'false') echo "a3: 33333333333333<br>"; //--------------------成立--------------------成立
if('false' == '0') echo "a3: 44444444444444<br>";
if('false' == '0.0') echo "a3: 55555555555555<br>";
if('false' == null) echo "a3: 66666666666666<br>";
if('false' == false) echo "a3: 77777777777777<br>";
if('false' == 0) echo "a3: 88888888888888<br>"; //--------------------成立
if('false' == 0.0) echo "a3: 99999999999999<br>"; //--------------------成立
echo "<br><br>";


if('0' == '') echo "a4: 11111111111111<br>";
if('0' == 'null') echo "a4: 22222222222222<br>";
if('0' == 'false') echo "a4: 33333333333333<br>";
if('0' == '0') echo "a4: 44444444444444<br>"; //--------------------成立--------------------成立
if('0' == '0.0') echo "a4: 55555555555555<br>"; //--------------------成立
if('0' == null) echo "a4: 66666666666666<br>";
if('0' == false) echo "a4: 77777777777777<br>"; //--------------------成立--------------------成立
if('0' == 0) echo "a4: 88888888888888<br>"; //--------------------成立--------------------成立
if('0' == 0.0) echo "a4: 99999999999999<br>"; //--------------------成立--------------------成立
echo "<br><br>";


if('0.0' == '') echo "a5: 11111111111111<br>";
if('0.0' == 'null') echo "a5: 22222222222222<br>";
if('0.0' == 'false') echo "a5: 33333333333333<br>";
if('0.0' == '0') echo "a5: 44444444444444<br>"; //--------------------成立
if('0.0' == '0.0') echo "a5: 55555555555555<br>"; //--------------------成立--------------------成立
if('0.0' == null) echo "a5: 66666666666666<br>";
if('0.0' == false) echo "a5: 77777777777777<br>"; //--------------------------------------------成立
if('0.0' == 0) echo "a5: 88888888888888<br>"; //--------------------成立--------------------成立
if('0.0' == 0.0) echo "a5: 99999999999999<br>"; //--------------------成立--------------------成立
echo "<br><br>";


if(null == '') echo "a6: 11111111111111<br>"; //--------------------成立
if(null == 'null') echo "a6: 22222222222222<br>";
if(null == 'false') echo "a6: 33333333333333<br>";
if(null == '0') echo "a6: 44444444444444<br>";
if(null == '0.0') echo "a6: 55555555555555<br>";
if(null == null) echo "a6: 66666666666666<br>"; //--------------------成立--------------------成立
if(null == false) echo "a6: 77777777777777<br>"; //--------------------成立
if(null == 0) echo "a6: 88888888888888<br>"; //--------------------成立
if(null == 0.0) echo "a6: 99999999999999<br>"; //--------------------成立
echo "<br><br>";


if(false == '') echo "a7: 11111111111111<br>"; //--------------------成立--------------------成立
if(false == 'null') echo "a7: 22222222222222<br>";
if(false == 'false') echo "a7: 33333333333333<br>";
if(false == '0') echo "a7: 44444444444444<br>"; //--------------------成立--------------------成立
if(false == '0.0') echo "a7: 55555555555555<br>"; //--------------------------------------------成立
if(false == null) echo "a7: 66666666666666<br>"; //--------------------成立
if(false == false) echo "a7: 77777777777777<br>"; //--------------------成立--------------------成立
if(false == 0) echo "a7: 88888888888888<br>"; //--------------------成立--------------------成立
if(false == 0.0) echo "a7: 99999999999999<br>"; //--------------------成立--------------------成立
echo "<br><br>";


if(0 == '') echo "a8: 11111111111111<br>"; //--------------------成立--------------------成立
if(0 == 'null') echo "a8: 22222222222222<br>"; //--------------------成立
if(0 == 'false') echo "a8: 33333333333333<br>"; //--------------------成立
if(0 == '0') echo "a8: 44444444444444<br>"; //--------------------成立--------------------成立
if(0 == '0.0') echo "a8: 55555555555555<br>"; //--------------------成立--------------------成立
if(0 == null) echo "a8: 66666666666666<br>"; //--------------------成立
if(0 == false) echo "a8: 77777777777777<br>"; //--------------------成立--------------------成立
if(0 == 0) echo "a8: 88888888888888<br>"; //--------------------成立--------------------成立
if(0 == 0.0) echo "a8: 99999999999999<br>"; //--------------------成立--------------------成立
echo "<br><br>";


if(0.0 == '') echo "a9: 11111111111111<br>"; //--------------------成立--------------------成立
if(0.0 == 'null') echo "a9: 22222222222222<br>"; //--------------------成立
if(0.0 == 'false') echo "a9: 33333333333333<br>"; //--------------------成立
if(0.0 == '0') echo "a9: 44444444444444<br>"; //--------------------成立--------------------成立
if(0.0 == '0.0') echo "a9: 55555555555555<br>"; //--------------------成立--------------------成立
if(0.0 == null) echo "a9: 66666666666666<br>"; //--------------------成立
if(0.0 == false) echo "a9: 77777777777777<br>"; //--------------------成立--------------------成立
if(0.0 == 0) echo "a9: 88888888888888<br>"; //--------------------成立--------------------成立
if(0.0 == 0.0) echo "a9: 99999999999999<br>"; //--------------------成立--------------------成立
echo "<br><br>";


$v1 = '';
$v2 = 'null';
$v3 = 'false';
$v4 = '0';
$v5 = '0.0';
$v6 = null;
$v7 = false;
$v8 = 0;
$v9 = 0.0;


if($v1) /*''*/ echo "a10: 11111111111111<br>"; //--------------------成立
if($v2) /*'null'*/ echo "a10: 22222222222222<br>"; //--------------------成立--------------------成立
if($v3) /*'false'*/ echo "a10: 33333333333333<br>"; //--------------------成立--------------------成立
if($v4) /*'0'*/ echo "a10: 44444444444444<br>"; //--------------------成立--------------------成立
if($v5) /*'0.0'*/ echo "a10: 55555555555555<br>"; //--------------------成立--------------------成立
if($v6) /*null*/ echo "a10: 66666666666666<br>";
if($v7) /*false*/ echo "a10: 77777777777777<br>"; //--------------------成立
if($v8) /*0*/ echo "a10: 88888888888888<br>"; //--------------------成立
if($v9) /*0.0*/ echo "a10: 99999999999999<br>"; //--------------------成立


if(empty($v1)) /*''*/ echo "a11: 11111111111111<br>"; //--------------------成立
if(empty($v2)) /*'null'*/ echo "a11: 22222222222222<br>";
if(empty($v3)) /*'false'*/ echo "a11: 33333333333333<br>";
if(empty($v4)) /*'0'*/ echo "a11: 44444444444444<br>"; //--------------------成立
if(empty($v5)) /*'0.0'*/ echo "a11: 55555555555555<br>";
if(empty($v6)) /*null*/ echo "a11: 66666666666666<br>"; //--------------------成立
if(empty($v7)) /*false*/ echo "a11: 77777777777777<br>"; //--------------------成立
if(empty($v8)) /*0*/ echo "a11: 88888888888888<br>"; //--------------------成立
if(empty($v9)) /*0.0*/ echo "a11: 99999999999999<br>"; //--------------------成立
echo "<br><br>";

...全文
800 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
蛮吉是魁拔 2017-10-30
  • 打赏
  • 举报
回复
引用 6 楼 szuzsq 的回复:
[quote=引用 5 楼 xuzuning 的回复:] 因为 '0.0'、'null'、'false' 都是长度大于 1 的字符串
那为毛以下代码第一个不成立呢?

if('false' == false)		echo "a3: 77777777777777<br>";
if('false' == 0)		echo "a3: 88888888888888<br>"; //--------------------成立
if('false' == 0.0)		echo "a3: 99999999999999<br>"; //--------------------成立
还有,以下全都成立

if(empty(null))			echo '11111111111'.'<br>'; //--------------------成立
if(empty(''))			echo '222222222222'.'<br>'; //--------------------成立
if(empty('0'))			echo '33333333333'.'<br>'; //--------------------成立
为毛以下就只有第一条成立了呢?

if(null == '')			echo "a6: 11111111111111<br>"; //--------------------成立
if(null == '0') 			echo "a6: 44444444444444<br>";
if(null == '0.0') 		echo "a6: 55555555555555<br>";
总之,我还是坚持我的观点,我认为php的设计者或者实现者,自已都混乱了..... 我总结为,在php做网站时,牵涉到页面传值get,post等时: 不要用'null', 'false', 'true', '0.0'.....例如用int的0和1,不要用false和true... 这样能避免很多错误...[/quote] 因为php 单引号表示的是字符串,如 if('false' == false) ,一个值为'false'的字符串怎么会和一个值为0的false变量相等呢
傲雪星枫 2017-09-09
  • 打赏
  • 举报
回复
用===判断就好了。
szuzsq 2017-09-07
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
因为 '0.0'、'null'、'false' 都是长度大于 1 的字符串
那为毛以下代码第一个不成立呢?

if('false' == false)		echo "a3: 77777777777777<br>";
if('false' == 0)		echo "a3: 88888888888888<br>"; //--------------------成立
if('false' == 0.0)		echo "a3: 99999999999999<br>"; //--------------------成立
还有,以下全都成立

if(empty(null))			echo '11111111111'.'<br>'; //--------------------成立
if(empty(''))			echo '222222222222'.'<br>'; //--------------------成立
if(empty('0'))			echo '33333333333'.'<br>'; //--------------------成立
为毛以下就只有第一条成立了呢?

if(null == '')			echo "a6: 11111111111111<br>"; //--------------------成立
if(null == '0') 			echo "a6: 44444444444444<br>";
if(null == '0.0') 		echo "a6: 55555555555555<br>";
总之,我还是坚持我的观点,我认为php的设计者或者实现者,自已都混乱了..... 我总结为,在php做网站时,牵涉到页面传值get,post等时: 不要用'null', 'false', 'true', '0.0'.....例如用int的0和1,不要用false和true... 这样能避免很多错误...
xuzuning 2017-09-04
  • 打赏
  • 举报
回复
因为 '0.0'、'null'、'false' 都是长度大于 1 的字符串
szuzsq 2017-09-04
  • 打赏
  • 举报
回复
因为php是弱类型语言 0为空,所以'0'为空 那么 0.0为空,为什么'0.0'不为空? null为空,为什么'null'不为空? false为空,为什么'false'不为空?
szuzsq 2017-09-04
  • 打赏
  • 举报
回复
其实我可能没表达清楚. 我是指php处理null、false、0、0.0、''、'0'这些,把它们认为是空.我都好理解. 但是处理'false'、‘0.0’这2个,就有些乱了,感觉php的设计者,头脑都有些乱. 以下代码,只会打印,最后三个 66666666666666666 77777777777777777 88888888888888888

$v1 = 0;
$v2 = 0.0;
$v3 = null;
$v4 = false;
$v5 = '0';
$v6 = '0.0';
$v7 = 'null';
$v8 = 'false';

if($v1) echo '111111111111111111111111'.'<br>';
if($v2) echo '222222222222222222222222'.'<br>';
if($v3) echo '333333333333333333333333'.'<br>';
if($v4) echo '444444444444444444444444'.'<br>';
if($v5) echo '555555555555555555555555'.'<br>';
if($v6) echo '666666666666666666666666'.'<br>';
if($v7) echo '777777777777777777777777'.'<br>';
if($v8) echo '888888888888888888888888'.'<br>';
那么我就问了, 0为空我能理解. 0.0为空我能理解. null为空我能理解. false为空我能理解. '0'为空我能理解. ok来了, 为什么 '0.0'不为空??? 'null'不为空??? 'false'不为空???
黄袍披身 2017-08-29
  • 打赏
  • 举报
回复
可以上HHVM...
xuzuning 2017-08-28
  • 打赏
  • 举报
回复
看手册是非常必要的

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧