天天看點

php空值的判斷,PHP 類型判斷和NULL,空值檢查

PHP是一種寬松類型的程式設計語言,在函數中對傳入的參數值的“類型”以及”值是否為空或者NULL“進行檢查是不可缺少的步驟。

類型檢查

從PHP5開始,PHP允許對函數的參數進行類型限制,即可以限制參數的類型為對象,接口,數組(PHP 5.1開始)或者callable(PHP5.4起),但是不可以限制參數類型為标量類型(如int ,string,bool),也不可以限制為Traits類型。如果不限制,預設情況下,參數的類型為mixed,即可以接受所有類型。

function test(array $names)//正确的做法

function test(string $name)//錯誤的做法

針對特定參數類型的功能函數,在函數中對參入的參數進行類型檢查是很必須(雖然我見過一些國外學者的文章,它們不推薦這麼做,這麼做相當于束縛了函數的功能)。

在PHP中可以通過gettype和get_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; 以及沒有任何屬性的對象都将被認為是空的,都代表了為零。

如果$e是未定義或值為NULLL,$e=NULL,它肯定是空,即empty($e)=true;

如果$e是int類型,$e=0,就相對于數字,0代表為零,即empty($e)=true;

如果$e是string類型,$e="",相對于字元串,”“就代表為是空,即empty($e)=true;

如果$e是string類型,$e="0",相對于字元串,”0“就代表為是零,即empty($e)=true;

如果$e是bool類型, $e=false,相對true,false就代表為空,即empty($e)=true;

如果$e是array類型,$a=array(),相對數組來說,沒有元素的資料就為空,即empty($e)=true;

除了當變量沒有置值時不産生警告之外, empty() 是 (boolean) var 的反義詞。

擴充閱讀:

【跟着子遲品 underscore】常用類型判斷以及一些有用的工具方法

Why underscore 最近開始看 underscore.js 源碼,并将 underscore.js 源碼解讀 放在了我的 2016 計劃中. 閱讀一些著名架構類庫的源碼,就好像和一個個大師對 ...

[改善Java代碼]在equals中使用getClass進行類型判斷

建議47: 在equals中使用getClass進行類型判斷 本節我們繼續讨論覆寫equals的問題.這次我們編寫一個員工Employee類繼承Person類,這很正常,員工也是人嘛,而且在JEE中J ...

JavaScript 類型判斷 —— typeof 以及 instanceof 中的陷阱

JavaScript中基本類型包含Undefined.Null.Boolean.Number.String以及Object引用類型.基本類型可以通過typeof來進行檢測,對象類型可以通過instan ...

Underscore.js 常用類型判斷以及一些有用的工具方法

1. 常用類型判斷以及一些有用的工具方法 underscore.js 中一些 JavaScript 常用類型檢查方法,以及一些工具類的判斷方法. 首先我們先來談一談數組類型的判斷.先貼出我自己封裝好的 ...

TypeScript 之類型判斷

在使用 Angular 做項目的時候,對 TypeScript 的類型判斷不太熟練,為了友善查找,特意對 TypeScript 的類型判斷做了簡單梳理.文章隻是 TS 官網的内容摘要,沒有高深的知識, ...

(轉)Java 中關于String的空對象(null) ,空值(empty),空格

原文出處:Java 中關于String的空對象(null) ,空值(empty),空格 定義 空對象: String s = null; 空對象是指定義一個對象s,但是沒有給該對象配置設定空間,即沒有執行個體 ...

JS類型判斷typeof PK {}.toString.call(obj)

參考連結:https://www.talkingcoder.com/article/6333557442705696719 先看typeof

kotlin基礎 空值檢查

NULL檢查機制 Kotlin的空安全設計對于聲明可為空的參數,在使用時要進行空判斷處理,有兩種處理方式,字段後加!!像Java一樣抛出空異常,另一種字段後加?可不做處理傳回值為 null或配合?:做 ...

Java中類型判斷的幾種方式

1. 前言 在Java這種強類型語言中類型轉換.類型判斷是經常遇到的.今天就細數一下Java中類型判斷的方法方式. 2. instanceof instanceof是Java的一個運算符,用來判斷一個 ...

随機推薦

UI控件封裝一般步驟

封裝 如果一個view内部的子控件比較多,一般會考慮自定義一個view,把它内部的子控件的建立屏蔽起來,不讓外界關心 外界可以傳入對應的模型資料給view,view拿到模型資料後給内部的子控件設定對應 ...

Quartz-2D

Quartz 2D是一個二維圖形繪制引擎,支援iOS環境和Mac OS X環境.我們可以使用Quartz 2D API來實作許多功能,如基本路徑的繪制.透明度.描影.繪制陰影.透明層.顔色管理.反鋸齒 ...

結構-行為-樣式-requireJs實作圖檔輪播插件

最近工作需要,就自己寫了一個圖檔輪播插件,不過想到要內建到架構中,于是又用RequireJs改了一遍. 主要檔案: style.css jquery-1.11.1.min.js require.js ...

Oracle漏洞分析(tns_auth_sesskey)

p216 Oracle漏洞分析: 開啟oracle: C:\oracle\product\\db_1\BIN\sqlplus.exe /nolog conn sys/mima1234 as sysdb ...

郵件報警以及服務端能否ping通用戶端的小例子(三)

就這個小小的東西,弄了一天,弄的頭暈眼花,畢竟第一次弄這個,記錄下來,若幹年之後,回看這些筆記,不知是什麼樣的感想,哈哈.我學一個東西的時候喜歡系統的來,一點一點的來,做這個的時候想法很 ...

lvs+nginx負載均衡

1       學習目标 掌握什麼是負載均衡及負載均衡的作用和意義. 了解lvs負載均衡的三種模式. 了解lvs-DR負載均衡部署方法. 掌握nginx實作負載均衡的方法. 掌握lvs+nginx負載 ...

Sql Server查詢性能優化之不可小觑的書簽查找

小小程式猿SQL Server認知的成長 1.沒畢業或工作沒多久,隻知道有資料庫.SQL這麼個東東,渾然分不清SQL和Sql Server Oracle.MySql的關系,通常認為SQL就是SQL S ...

python 微信機器人,微信自動回複

使用python現成的子產品 itchat,可以實作,微信機器人的自動回複 其内部原理,是模拟了web版微信的登入,然後進行消息的接收發送,并不是隻能用python實作,其他後端語言都可以做到 下面是使 ...

JQ_五星級評分特效

代碼如下:

Ubuntu 13.04開機亮度調節

終于把我的T430換成Ubuntu,本來還打算等幾天13.10,想想反正能更新,趁着101長假就抓緊換了吧~` 總體來說遇到的問題不是很多,可能是Thinkpad在Linux或者ubuntu的方面做的 ...