因為我推論null的記憶體位址空間是沒有值的,而其他兩個有位址
小伙看你根骨奇佳,潜力无限,来学PHP伐。
以下論點全部基於PHP 5
PHP 5
依php 5.6的zval类型(PHP 7中結構有變化)
php 5.6
zval
PHP 7
typedef struct _zval_struct zval; ... struct _zval_struct { /* Variable information */ zvalue_value value; // 值 zend_uint refcount__gc; // 引用计数,默认 1 zend_uchar type; // 变量类型 zend_uchar is_ref__gc; // 是否是引用,默认 0 };
zend_uchar type的type的值可以為
zend_uchar type
type
IS_NULL IS_BOOL IS_LONG IS_DOUBLE IS_STRING IS_ARRAY IS_OBJECT IS_RESOURCE
PHP是根據type來區分變數的型別
所以null对php来说,与bool/long對比, 並沒有什麼特殊的優勢
null
php
bool
long
null变量,表示zvalue_value value无需赋值,相比String、Array需要申请大量内存的操作来说,还是具备一定的优势,但是对比LONG、BOOL來說,這點效能優勢基本上可以忽略,解釋如下:
zvalue_value value
String
Array
LONG
BOOL
小到一個bool值,大到一個複合數組,在php核心实现中,都是C语言的zVal结构。 歸納起來,也就是如下PHP聲明:
zVal结构
$n = null; $a = true; $b = 123; $c = 321.123; $d = 'string'; $e = []; $f = new SomeClass(); $g = fopen('xxx', 'r'); $h = &$b; //引用,比较特殊
以上變量,在/usr/bin/php執行到這行時,都會在記憶體中轉換為zVal結構,/usr/bin/php执行到这行时,都会在内存中转化为zVal结构,type的值上面已經講解過,下面講解其值將如何存儲,
/usr/bin/php
zVal結構
PHP變數的值儲存在zvalue_value value变量中,其中zvalue_value變數中,其中zvalue_value的結構如下:
zvalue_value
typedef union _zvalue_value { long lval; //整形 double dval; //浮点 struct { //字符串 char *val; int len; } str; HashTable *ht; //数组, 也就是hashmap zend_object_value obj; // Object } zvalue_value;
union在C语言里面是一个联合体,表示一次只會一個成員生效,其特徵是記憶體的長度=最長的那個成員長度。 PHP變數使用的成員如下:
union
联合体
NULL 不使用 BOOL/LONG 使用 lval; DOUBLE 使用 dval; String 使用 str; Array 使用 ht; Resource 使用 lval; Object 使用 obj;
其中Object、Resource、Array的實作會非常複雜,不在本文討論之列,詳情請查看文本底部的超級連結。
Object
Resource
根據上表,NULL類型的變數在設定type = IS_NULL之後,而無需賦值valueNULL类型的变量在设置type = IS_NULL之后,而无需赋值value而0/false赋值在设置type = IS_BOOL / IS_LONG之后,再多一句赋值value.lval = 0;而0/false賦值在設定type = IS_BOOL / IS_LONG之後,再多一句賦值value.lval = 0;的操作:
NULL
type = IS_NULL
value
0/false
type = IS_BOOL / IS_LONG
value.lval = 0;
0/false賦值在設定type = IS_BOOL / IS_LONG之後,再多一句賦值value.lval = 0;的操作:
然而不論value中的成員是否賦值,value中的成员是否赋值,zvalue_value value都是需要佔用記憶體的,
成員
成员
如此而來,NULL仅仅是少一个赋值 4 bytes記憶體 的過程,但以現代的CPU來看,這點優勢可以忽略不計。
4 bytes
詳情請看http://www.php-internals.com/...
實際專案中可以忽略不計吧
依
php 5.6
的zval
类型(PHP 7
中結構有變化)zend_uchar type
的type
的值可以為PHP是根據
type
來區分變數的型別結論
所以
null
对php
来说,与bool
/long
對比, 並沒有什麼特殊的優勢沒有優勢
null
变量,表示zvalue_value value
无需赋值,相比String
、Array
需要申请大量内存的操作来说,还是具备一定的优势,但是对比LONG
、BOOL
來說,這點效能優勢基本上可以忽略,解釋如下:zVal 是什麼
小到一個bool值,大到一個複合數組,在
php
核心实现中,都是C语言的zVal结构
。歸納起來,也就是如下PHP聲明:
以上變量,在
/usr/bin/php
執行到這行時,都會在記憶體中轉換為zVal結構
,/usr/bin/php
执行到这行时,都会在内存中转化为zVal结构
,type
的值上面已經講解過,下面講解其值將如何存儲,zvalue_value value
的結構PHP變數的值儲存在
zvalue_value value
变量中,其中zvalue_value
變數中,其中zvalue_value
的結構如下:union
在C语言里面是一个联合体
,表示一次只會一個成員生效,其特徵是記憶體的長度=最長的那個成員長度。PHP變數使用的成員如下:
根據上表,
NULL
類型的變數在設定type = IS_NULL
之後,而無需賦值value
NULL
类型的变量在设置type = IS_NULL
之后,而无需赋值value
而
0/false
赋值在设置type = IS_BOOL / IS_LONG
之后,再多一句赋值value.lval = 0;
而0/false賦值在設定
type = IS_BOOL / IS_LONG
之後,再多一句賦值value.lval = 0;
的操作:然而不論
value
中的成員
是否賦值,value
中的成员
是否赋值,zvalue_value value
都是需要佔用記憶體的,如此而來,
NULL
仅仅是少一个赋值4 bytes
記憶體 的過程,但以現代的CPU來看,這點優勢可以忽略不計。詳情請看http://www.php-internals.com/...
實際專案中可以忽略不計吧