從儲存結構理解php空,null,0'0'false____儲存

來源:互聯網
上載者:User
相信不少開發人員對網路上的 0 "0" null false '' 的講解司空見慣,瞭然於胸了, 但我相信總有你忽略的細節,或者從變數結構角度出發,該如何解釋。那麼看看下邊的驗證吧。
echo 'php版本:'.PHP_VERSION; //5.6.28$a =  0; $b="0"; $c= ''; $d= null; $e = false;echo "5個變數-原始測試類型";var_dump($a);//int 0var_dump($b);//string '0'var_dump($c);//string ''var_dump($d);//nullvar_dump($e);//boolean falseecho "<h4>empty測試</h4>";var_dump(empty($a));//truevar_dump(empty($b));//truevar_dump(empty($c));//truevar_dump(empty($d));//truevar_dump(empty($e));//trueecho "<hr>";var_dump(isset($a));//truevar_dump(isset($b));//truevar_dump(isset($c));//truevar_dump(isset($d));//【false】 見結論一var_dump(isset($e));//trueecho "<h4>(==)雙等式測試</h4>";var_dump($a == $b);//truevar_dump($a == $c);//truevar_dump($a == $d);//truevar_dump($a == $e);//true 。。var_dump($b == $c);//【false】見結論二var_dump($b == $d);//【false】見結論二var_dump($b == $e);//truevar_dump($c == $d);//truevar_dump($c == $e);//trueecho "<h4>(===)三等式測試</h4>";var_dump($a === $b);//falsevar_dump($a === $c);//falsevar_dump($a === $d);//falsevar_dump($a === $e);//falsevar_dump($b === $c);//falsevar_dump($b === $d);//falsevar_dump($b === $e);//falsevar_dump($c === $d);//falsevar_dump($c === $e);//false


總結: 對於 【0 ;"0" ;'' ;null; false】五種類型 empty操作以上五個變數,都返回false 強等於(===)比較 都為false,同強語言結果 但對於(==)比較,需要注意string類型,涉及到底層結構與類型轉換
結論一:關於變數類型的理解 1.null為不存在之意:php底層的zval空間裡(結構見下方)沒有存其value值,只儲存了一個type標誌其 IS_NULL(所以解釋了 empty(null)=true,isset(null)=false ,isset('')=true) 2.【0 ; "0" ; "" ; false 】:這四個為存在,php底層是開闢zval空間儲存,有value,有type
結論二:從底層結構理解 理解了上邊結論一,那麼下邊的結論就容易理解了,還不太清楚的可以詳細看下【   PHP核心的儲存機制(分離/改變) 】 其中的【1.zval結構】,【2.zend_uchar type】部分
string '0'與 string'' 不相等,(想一下就明白,同類型比較【1個長度】的字串怎麼可能 等於 【0個長度】 的字串,zal的value結構裡,對string值有len原始記錄的) int 0 卻和 string'' 空相等,(非同類形比較,php會做類型轉換)
string '0' 與 null 不相等 int 0 與 null 相等
說白了,對於php,碰到 string "0" 的等式判斷的時候,停頓注意一下就行。其他的等式判斷正常,符合福士熟知的php開發思維。

php變數zval結構: //存放變數的基本資料
struct _zval_struct {     /* Variable information */     zvalue_value value;  /* 變數值儲存在這裡 12位元組*/     zend_uint refcount;//4位元組,變數引用計數器     zend_uchar type;   /* active type變數類型 1位元組*/     zend_uchar is_ref;//是否變數被&引用,0表示非引用,1表示引用,1位元組  };  

//存放變數的值
typedef union _zvalue_value {     long lval;      /* long value */     double dval;    /* double value */     struct {     char *val; //4位元組     int len;   //4位元組     } str;     HashTable *ht;    /* hash table value */     zend_object_value obj;  } zvalue_value;


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.