PHP中奇葩的 , ,isset,empty

2021-10-16 10:24:44 字數 2972 閱讀 8223

個人感覺,php中的關於判斷變數是否存在或者為空的語法設計是失敗的,分工不明確,界限不清楚,判斷起來很容易遺留漏洞,使用php開發5年多了,經常看到因為輸入引數問題導致的系統錯誤,即便是工作多年的phper,有人把這歸結為靈活,但是經驗越久越傾向於將函式設計的功能明確且單一,更傾向於確定性的東西,討厭這種看起來功能多但是模糊的設計,這不能歸結為php是弱型別語言,而是實現者的問題。

isset

檢測變數是否已設定並且非null

isset ( mixed $var

, mixed $...

=?): bool

<?php

functiontt(

)$a=null;$b

=0;$c

=;var_dump

(isset($a

));// false

var_dump

(isset($b

));// true

var_dump

(isset($c

));// true

var_dump

(isset($c

['name'])

);// false

var_dump

(isset($d

));// false

var_dump

(isset($a

,$b,$c

,$d))

;// false

// var_dump(isset("abc")); // 語法錯誤

// var_dump(isset(tt())); // 語法錯誤

// var_dump(isset(my_const)); // 語法錯誤

可安全的用於檢查物件的物件的變數

// instead of writing

isset

($abc)&&

isset

($abc

->

def)

&&isset

($abc

->

def-

>

ghi)

;// or in a shorter form

isset

($abc

,$abc

->

def,

$abc

->

def-

>

ghi)

;// you can just write

isset (

$abc

->

def-

>

ghi)

;

empty()

判斷乙個變數不存在,或為空。

empty ( mixed $var

): bool

<?php

functiontt(

)$a=null;$b

=0;$c

=;var_dump

(empty($a

));// true

var_dump

(empty($b

));// true

var_dump

(empty($c

));// true

var_dump

(empty($c

['name'])

);// true

var_dump

(empty($d

));// true

var_dump

(empty

("abc"))

;// false

var_dump

(empty(tt

()))

;// true

// var_dump(empty(my_const)); // 語法錯誤

!

判斷是否為空。也可以判斷是否存在,未定義的變數會報php notice,也不會報語法錯誤,不會終止程式。

<?php

functiontt(

)$a=null;$b

=0;$c

=;var_dump(!

$a);// true

var_dump(!

$b);// true

var_dump(!

$c);// true

var_dump(!

$c['name'])

;// true php notice: undefined index: name

var_dump(!

$d);// true php notice: undefined index: name

var_dump(!

("abc"))

;// false

var_dump(!

tt())

;// true

// var_dump(!my_const); // 語法錯誤

?:

三目運算子的簡寫。

$c

['name']?

:10 等價於 !$c[

'name']?

10:$c[

'name'

]

所以說它的判斷依據依然是:判斷是否為空。也可以判斷是否存在,未定義的變數會報php notice,也不會報語法錯誤,不會終止程式。

??

$a??

10 等價於 isset($a

)?$a:

1

歸納

判斷是否存在:isset, ??判斷不存在,或為空:empty()判斷是否為空,不建議用來判斷是否存在:!, ?:

php 學習筆記,奇葩的陣列和資源

陣列的每個資料稱為乙個元素,元素包括索引和值兩個部分 索引可以由數字或字串組成,元素的值可以是多種資料型別 arr1 array this is a example arr2 array 0 php 1 is the the str best arr3 0 tmpname 顯示了陣列的3種宣告方式,...

php7擴充套件安裝奇葩事

早上好冷,真不想接 啊。但是事情往往就朝你不希望的方向發展,裡說 php7安裝memcache模組有問題,按網上搜尋的好多種方法都不行 考慮到小朋友要去幹別的活,只好親自上陣。根據貼圖,他是卡在memcache編譯那一步.不要點這裡 php7的memcache擴充套件已經跟以前不一樣了,需要用其他分...

php7擴充套件安裝奇葩事

早上好冷,真不想接 啊。但是事情往往就朝你不希望的方向發展,裡說 php7安裝memcache模組有問題,按網上搜尋的好多種方法都不行 考慮到小朋友要去幹別的活,只好親自上陣。根據貼圖,他是卡在memcache編譯那一步.不要點這裡 php7的memcache擴充套件已經跟以前不一樣了,需要用其他分...