PHP弱数据类型的内部实现

来源:互联网 发布:我为什么离开华为 知乎 编辑:程序博客网 时间:2024/05/23 07:25

PHP那个该死的若类型是怎么实现的

打开php代码中Zend.h和Zend_types.h可以看到有如下定义:


typedef union _zvalue_value {    long lval;          /* 长整形 */    double dval;        /* 双精度 */    struct {        char *val;        int len;    } str;/*字符串*/    HashTable *ht;      /*hash表 */    zend_object obj;    /*PHP对象存储结构*/} zvalue_value;struct _zval_struct {    zvalue_value value; /*值*/    zend_uchar type;    /*当前类型*/    zend_uchar is_ref;  /*。。。。。。。。。。。。。。看起来是是否被引用了*/    zend_ushort refcount;  /*引用计数器*/};typedef struct _zval_struct zval;typedef zval pval;/*这玩意就是一个句柄表么*/typedef unsigned int zend_object_handle;typedef struct _zend_object_handlers zend_object_handlers;typedef struct _zend_object_value {    zend_object_handle handle;    zend_object_handlers *handlers;} zend_object_value;/*对象结构体*/struct _zend_object_handlers {/* general object functions */zend_object_add_ref_tadd_ref;zend_object_del_ref_tdel_ref;zend_object_clone_obj_tclone_obj;/* individual object functions */zend_object_read_property_tread_property;zend_object_write_property_twrite_property;zend_object_read_dimension_tread_dimension;zend_object_write_dimension_twrite_dimension;zend_object_get_property_ptr_ptr_tget_property_ptr_ptr;zend_object_get_tget;zend_object_set_tset;zend_object_has_property_thas_property;zend_object_unset_property_tunset_property;zend_object_has_dimension_thas_dimension;zend_object_unset_dimension_tunset_dimension;zend_object_get_properties_tget_properties;zend_object_get_method_tget_method;zend_object_call_method_tcall_method;zend_object_get_constructor_tget_constructor;zend_object_get_class_entry_tget_class_entry;zend_object_get_class_name_tget_class_name;zend_object_compare_tcompare_objects;zend_object_cast_tcast_object;zend_object_count_elements_tcount_elements;zend_object_get_debug_info_tget_debug_info;zend_object_get_closure_tget_closure;}

这个结构体里面实现了:长整型,双精度浮点,字符串,hash表,还有对象(zend_object_value)。就是zval和pval两个结构。