PHP 由 empty 和 isset 面試題引起的思考

hallo_monde發表於2018-06-07
在我們的 php 面試中,一面基礎面中經常會有面試官問 emptyisset 的區別,往往大家都是簡單的說出兩者的用法,其實如果深入進問題的本質,我認為不僅僅可以讓面試官順著你走,可能還會給面試官一種驚豔的感覺

  • empty — 檢查一個變數是否為空
    • 當變數存在,並且是一個非空非零的值時返回 false 否則返回 true
    • 以下變數都被認為是空
      • ' ' (空字串)
      • 0 (作為整數的0)
      • 0.0 (作為浮點數的0)
      • "0" (作為字串的0)
      • null
      • false
      • array() (一個空陣列)
      • $var; (一個宣告瞭,但是沒有值的變數)

  • isset — 檢測變數是否已設定並且非 null
    • 如果變數存在並且值不是 null 則返回 true,否則返回 false

  • 這裡我們會發現 empty 和 isset 細節的區別其實就在 為 和為null
  • 所以只要我們能區分 null 的概念就非常容易理解這兩個函式的區別
  • 事實上 為包含了為null這個感念,為null 只有變數未宣告賦為null這兩種

  • 在這裡細心的同學就會問,false 是為空,為什麼同為布林型別的 true 並不為空呢?
  • 其實很簡單 因為 true 雖然型別為布林型別但值不為0
  • false 0.0 "0" '' null 雖然型別各異,但值都為 0 所以他們為空
<?php

$array = [0.0, '0', '', null, false];

$len = count($array);

for ($i = 0; $i < $len; $i++) {
    if (0 == $array[$i])
        echo 'yes' . PHP_EOL;
    else
        echo 'no' . PHP_EOL;
}
  • 驗證結果會輸出 5個 yes ,而把== 改為=== 後會輸出5個 no

  • 這裡就引申到了我們 php 型別判斷
  • php 是怎麼進行型別判斷的呢?這其實和 php zval 結構體有關係
  • 由於 php 型別推斷需要細說,所以型別推斷下次會再給大家詳細介紹

謝謝大家,如果看了我的文章有收穫,還請為我點贊,當然如果可以關注就更好了,再次感謝大家

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章