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. Hack语言类型化简介

    在typechecker的配合下,Hack语言的类型化能力是Hack其他功能特性的基石.开发Hack语言的主要动机也正是为代码提供显式类型标注以便对代码进行类型一致性和潜在错误分析. 这是用于对比Ha ...

  2. Oracle 数据库基础学习 (六) 子查询

    子查询在一个select中出现多个嵌套查询语句 1.在where子句中使用子查询(一般返回"单行单列" "单行多列" "多行单列"(可以提供 ...

  3. linux下安装redis的详细过程

    先安装一些组件: yum -y install gcc gcc-c++ libstdc++-devel 下载并安装: # wget http://download.redis.io/releases/ ...

  4. linux 查找目录或文件详解

    查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 -print 如果需要更进一步的了解,可以参看Linux的命令 ...

  5. 今天做项目用到框架,关于angual,然后自己整理了一番,自己上网也看了看。

    1. Angular 1.1. 库与框架的区别 jQuery:库 库一般都是封装了一些常用的方法 自己手动去调用这些方法,来完成我们的功能 $('#txt').val('我是小明'): $('div' ...

  6. JDBC详解

    一.相关概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它 ...

  7. JavaScript学习(3):函数式编程

    在这篇文章里,我们讨论函数式编程. 什么是函数式编程?根据百度百科的描述,“函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus). ...

  8. Asp.net EasyUI中的combogrid实现分页功能

    在jquery.easyUI.js 要实现分页,必须在后台接收参数时声明两个变量:page(当前第几页),rows(每页显示多少条信息),否者easyUI前台传递不了分页参数. 这两个属性的名称在ea ...

  9. 定制Eclipse IDE之功能篇(一)

    上文回顾:定制Eclipse IDE之界面篇   这一篇文章将记录一些Eclipse插件拓展(extension),简单讲述常用拓展的用法,但可能不会那么详细. 我的主要插件的拓展如下:   一.or ...

  10. abap 字符串处理

    1).SHIFT:截断字符串 SHIFT {c} [BY {n} PLACES] [{mode}].:      作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则 ...