php中null是否比false和0更有效率
伊谢尔伦
伊谢尔伦 2017-05-16 13:17:02
0
2
485

因為我推論null的記憶體位址空間是沒有值的,而其他兩個有位址

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(2)
PHPzhong

以下論點全部基於PHP 5

php 5.6zval类型(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 typetype的值可以為

IS_NULL
IS_BOOL
IS_LONG
IS_DOUBLE
IS_STRING
IS_ARRAY
IS_OBJECT
IS_RESOURCE

PHP是根據type來區分變數的型別

結論

所以nullphp来说,与bool/long對比, 並沒有什麼特殊的優勢

沒有優勢

null变量,表示zvalue_value value无需赋值,相比StringArray需要申请大量内存的操作来说,还是具备一定的优势,但是对比LONGBOOL來說,這點效能優勢基本上可以忽略,解釋如下:

zVal 是什麼

小到一個bool值,大到一個複合數組,在php核心实现中,都是C语言的zVal结构
歸納起來,也就是如下PHP聲明:

$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的值上面已經講解過,下面講解其值將如何存儲,

zvalue_value value 的結構

PHP變數的值儲存在zvalue_value 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變數使用的成員如下:

NULL      不使用
BOOL/LONG 使用    lval;
DOUBLE    使用    dval;
String    使用    str;
Array     使用    ht;
Resource  使用    lval;
Object    使用    obj;

其中ObjectResourceArray的實作會非常複雜,不在本文討論之列,詳情請查看文本底部的超級連結。

根據上表,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;的操作:

然而不論value中的成員是否賦值,value中的成员是否赋值,zvalue_value value都是需要佔用記憶體的,

如此而來,NULL仅仅是少一个赋值 4 bytes記憶體 的過程,但以現代的CPU來看,這點優勢可以忽略不計

詳情請看http://www.php-internals.com/...

世界只因有你

實際專案中可以忽略不計吧

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板