PHP是一种宽松类型的编程语言,在函数中对传入的参数值的“类型”以及”值是否为空或者NULL“进行检查是不可缺少的步骤。

  • 类型检查

从PHP5开始,PHP允许对函数的参数进行类型约束,即可以约束参数的类型为对象,接口,数组(PHP 5.1开始)或者callable(PHP5.4起),但是不可以约束参数类型为标量类型(如int ,string,bool),也不可以约束为Traits类型。如果不约束,默认情况下,参数的类型为mixed,即可以接受所有类型。

    1. function test(array $names)//正确的做法
    2. function test(string $name)//错误的做法

针对特定参数类型的功能函数,在函数中对参入的参数进行类型检查是很必须(虽然我见过一些国外学者的文章,它们不推荐这么做,这么做相当于束缚了函数的功能)。

在PHP中可以通过gettypeget_resource_type 两个函数得到变量的类型,它们分别返回参数的类型和资源类型的字符串,此时可以直接进行字符串比较来确定类型是否正确。另外一种方式是通过is_***系列的函数来判断变量的类型是否为指定的类型,比如is_array,is_scalar,is_resource,is_string。

  • 变量/常量是否定义或初始化

在PHP中,变量在定义以后不需要进行初始化,它会被初始化为具有其类型的默认值,但是不推荐这么做,一般情况下最好是对变量进行显示初始化。

对变量是否显式初始化可以使用”语法结构“-isset进行判断,它可以判断一个变量是否已经显式初始化。isset只有在变量”未显式赋值或者赋值为NULL“的时候返回为false,其他情况,比如值为空字符串,0等情况,它都返回true。

可以使用unset来删除一个已经定义的变量。

isset和unset只能是对”变量“进行判断和删除定义。如果是针对”常量“,那么就必须使用defined来判断。如果是针对”函数“,那么就必须使用function_exist()函数进行判断。

  • 判断变量是否为NULL

在PHP中要判断一个变量是否NULL有很多方式:

is_null VS isset

这两个函数都可以来判断一个变量是否为NULL,它们对空字符串,0,false的认同是一样的。即is_null=! isset()。

但是isset是语法结构,is_null是函数。在性能上,语法结构相对要优秀一点。所以很多地方都推荐使用isset来代替is_null的使用。

== VS ===

在有些情况下,推荐使用isset来判断一个变量是否为NULL。

但是从语义上来说,一个变量”是否已显示初始化“和”是否为NULL“是不同的概念,在某些场景下使用isset是不合适的,比如检查一个函数的返回值是否为NULL。

此时可以使用"=="和”===“来判断它们是否为NULL。

对于"=="和”===“,它们直接的区别还是很大。对于"==",它认同空字符串,0,false都为NULL。而对于"===",只有一个变量真的为NULL,它才代表NULL。

另外"==="相对于"isset"来说,性能基本接近,甚至要好点。

 

因此综上述,判断一个变量是否为NULL最好的办法就是直接使用"===",这样就不用在is_null,isset之间犹豫。其实上述的结论也同理于False的判断。

  • empty()函数的认识

在判断变量是否为NULL时候,也会把empty这个函数拿来和isset之类的一起讨论。其实这个函数没有必要和他们进行比较,因为它代表的意思很简单,它的意思就是判断一个变量所存储的内容是否为零或者为空,而这里的空不仅仅是NULL。那么有哪些内容代表零或者空的概念呢?""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,都代表了为零。

    1. 如果$e是未定义或值为NULLL,$e=NULL,它肯定是空,即empty($e)=true;
    2. 如果$e是int类型,$e=0,就相对于数字,0代表为,即empty($e)=true;
    3. 如果$e是string类型,$e="",相对于字符串,”“就代表为是空,即empty($e)=true;
    4. 如果$e是string类型,$e="0",相对于字符串,”0“就代表为是,即empty($e)=true;
    5. 如果$e是bool类型, $e=false,相对true,false就代表为空,即empty($e)=true;
    6. 如果$e是array类型,$a=array(),相对数组来说,没有元素的数据就为空,即empty($e)=true;

除了当变量没有置值时不产生警告之外, empty() 是 (boolean) var 的反义词。

  •  扩展阅读:

类型约束:http://www.php.net/manual/zh/language.oop5.typehinting.php

Variable handling 函数:http://www.php.net/manual/zh/ref.var.php

PHP 类型比较表:http://www.php.net/manual/zh/types.comparisons.php

PHP 类型判断和NULL,空值检查的更多相关文章

  1. 【跟着子迟品 underscore】常用类型判断以及一些有用的工具方法

    Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...

  2. [改善Java代码]在equals中使用getClass进行类型判断

    建议47: 在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题.这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JEE中J ...

  3. JavaScript 类型判断 —— typeof 以及 instanceof 中的陷阱

    JavaScript中基本类型包含Undefined.Null.Boolean.Number.String以及Object引用类型.基本类型可以通过typeof来进行检测,对象类型可以通过instan ...

  4. Underscore.js 常用类型判断以及一些有用的工具方法

    1. 常用类型判断以及一些有用的工具方法 underscore.js 中一些 JavaScript 常用类型检查方法,以及一些工具类的判断方法. 首先我们先来谈一谈数组类型的判断.先贴出我自己封装好的 ...

  5. TypeScript 之类型判断

    在使用 Angular 做项目的时候,对 TypeScript 的类型判断不太熟练,为了方便查找,特意对 TypeScript 的类型判断做了简单梳理.文章只是 TS 官网的内容摘要,没有高深的知识, ...

  6. (转)Java 中关于String的空对象(null) ,空值(empty),空格

    原文出处:Java 中关于String的空对象(null) ,空值(empty),空格 定义 空对象: String s = null; 空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例 ...

  7. JS类型判断typeof PK {}.toString.call(obj)

    参考链接:https://www.talkingcoder.com/article/6333557442705696719 先看typeof <!doctype html> <htm ...

  8. kotlin基础 空值检查

    NULL检查机制 Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做 ...

  9. Java中类型判断的几种方式

    1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...

随机推荐

  1. 使用DocX开源组件,实现动态数据的填充。

    1.先解释一下,什么叫做动态数据,动态数据指的是,一条数据的格式固定,但数据的条数不固定. 2.应用环境,在一个表格当中如果,现在表格有三行n列,如果你需要在表格第一行后添加同等规格的一行或n行,应该 ...

  2. GitHub上下载源代码的方法

    GitHub上找到自己要下载的项目以后,有3种方法可以下载源代码. 第一种是复制该项目的地址,然后用其他软件下载: 第二种是安装了官方客户端,可以直接点击"Clone in Desktop& ...

  3. SOA (面向服务的体系结构)

    面向服务的体系结构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台.操作系统和编程语言 ...

  4. C++学习笔记13:运算符重载(赋值操作符2)

    移动语义 完成所有权的移交,当拷贝构造和赋值构造时,目标对象的所有权必须移交给我们的新的对象,原始对象将丧失所有权,_p指针将不再指向原来的那个数组: 左值与右值 C原始定义 左值:可以出现在赋值号的 ...

  5. 使用Sublime Text作为Markdown编辑器

    Sublime Text 3作为一个优秀的文本编辑器,拥有很多的扩展插件.我们可以利用这些插件为Sublime Text 增加扩展的功能,在这里我们借助两个插件来将Sublime Text 3变成一个 ...

  6. 【HTML5】浅析HTML5应用程序缓存(ApplicationCache)

    一.为什么需要Web应用程序缓存 在移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得降低,比如坐在火车上,过了一个隧道(15分钟),便无法访问网站,这对于web的伤害是很大的    ...

  7. select中无法使用click的处理

    今天工作用到了select,想要给option添加click点击事件,可是却没有任何效果,百度了才发现,原来竟然是不支持呀! 众所周知(其实我才知道哎),在IE里, select的option是不支持 ...

  8. sharepoint2010问卷调查(4)-实现问卷的重复答复次数(采用自定义字段类型和JS)

    sharepoint的问卷调查可以设置重复和一次答复.但是设置一次后,调查过的用户再进行答复.会提示如下图: 分析下:该提示用户体验很不好.给用户感觉是系统出问题了.因此网上有人提出用eventhan ...

  9. Javascript - Arraylike的7种实现

    jQuery的崛起让ArrayLike(类数组)在javascript中大放异彩,它的出现为一组数据的行为(函数)扩展提供了基础. 类数组和数组相似,具有数组的某些行为,但是它相比数组可以更加自由的扩 ...

  10. ReflectUitls类的编写和对反射机制的解析

    ReflectUitls类的编写和对反射机制的解析 反射相关的类 反射相关的类,最基本的当然是Class类. 获取了Class对象之后,就可以接着生成对象实例.调用方法.查看字段等等. 字段(Fiel ...