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

作者:超级管理员 更新时间:2017-10-30 17:58:53 来源:未知 点击:15642
本帖最后由szuzsq于2017-08-2814:24:27编辑当为空(null、false、0、0.0、''、'null'、'false'、'0'、'0.0')时,它们之间的判断,太混乱了.如果是n
本帖最后由 szuzsq 于 2017-08-28 14:24:27 编辑
当为空(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>";

-------------------------------
看手册是非常必要的
-------------------------------
可以上HHVM...
-------------------------------
其实我可能没表达清楚.
我是指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'不为空???
-------------------------------
因为php是弱类型语言
0为空,所以'0'为空
那么
0.0为空,为什么'0.0'不为空?
null为空,为什么'null'不为空?
false为空,为什么'false'不为空?
-------------------------------
因为 '0.0'、'null'、'false' 都是长度大于 1 的字符串
-------------------------------
引用 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...
这样能避免很多错误...
-------------------------------
用===判断就好了。
-------------------------------
引用 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...
这样能避免很多错误...


因为php 单引号表示的是字符串,如 if('false' == false) ,一个值为'false'的字符串怎么会和一个值为0的false变量相等呢

推荐阅读

热门内容

微信公众号网页的服务器端php代码不能正

微信公众号网页的服务器端php代码不能正...

PHP好讨厌的弱类型:在为空(null,

本帖最后由szuzsq于2017-08-...

请输入正确的email,表达式是否有错?

这个是mvmmall\templates...

在 Laravel 中 “规范” 的开发

Laravel简介Laravel是一套简...

phpStudy配置多站点多域名方法及遇

此文不太适合一点不懂多站点多域名的。适合...

phpstudy的php版本自由修改的方

网上有着许多的网站集成搭建软件,比较出名...

PHP 对redis订阅的问题

有这么一个需求,客户下单,下单后把订单发...

我这里有三个分类,每个分类上面有相对应的

我这里有三个分类,每个分类上面有相对应的...

求解!!PHP+MYSQL一个复杂的递归

这是我的数据表,想实现的功能如下clas...

curl 请求301 Moved Per

[size=18px]phpcms项目 ...

最新内容

jquery 配合el表达式的问题

我想在想要做的是把var  id    的值放到 list    集合里面,变成...

关于restful api访问路径的写法

我想要将路径写成:/imm/assignments/list?page={pag...

java 每次调用对象方法都要初始化成员变量?

代码如下:package test;public class Test1 {in...

【debug】java

package math011;public class Math011 {pr...

如何禁止前台代码直接访问服务器上文件夹

环境:tomcat,servletWEB-INF文件夹下内容是无法在网页中通过u...

maven项目打包

求教。一个关于maven打包的问题-----------------------...

一放jsp上就报500的错

jsp代码截取:             

请问该下载那个lucene文件?

[   ] lucene-7.1.0-src.tgz    14-Oct-201...

Java maven项目启动时报错,求救??

我在svn上档下来的项目然后转成maven项目,在部署到tomcat后,启动项目...

大家好,在线等一个hibernate+struts2的案例

大家好,在线等一个hibernate+struts2的案例可发我邮件 35003...

zend studio中哪里关闭Xdebug调试功能

配置了zend studio与xdebug来调试php,现在是可以调试。但问题是...

郁闷,明明已经导入这些JAR包了怎么还是报找不到,几个意思啊?

在web.xml里面加了这个配置,想通过spring框架里面的日志管理类来加载我...

微信公众号网页的服务器端php代码不能正常写入和修改数据。

微信公众号网页的服务器端php代码不能正常写入和修改数据,不能使用tp3.2自带...

如何在自定义标签中使用 spring 注入

@Componentpublic class TestTag extends T...

tp5的memcache缓存怎么实现呀

$memcachehost='';$memcacheport='';$memca...

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

本帖最后由szuzsq于2017-08-2814:24:27编辑当为空(null...

怎么关闭XMemcached在控制台打印的心跳哟?

用了Xmemcached之后,在控制台里面一直打印[Xmemcached-Rea...

spring,注入静态变量

我的项目是全注解的,在使用类似:@Resourcepublic static A...

怎么解决R 文件丢失的问题啊,搞了好久,在线等大神回复

我是用as开发的项目,集成另外一个软件扫描功能的时候,R文件全线漂红,Rebui...

易用性测试详解

  易用性测试定义  易用性测试是指用户使用软件时是否感觉方便,比如是否最多点击...