PHP弱數據類型的內部實現

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_t					add_ref;
	zend_object_del_ref_t					del_ref;
	zend_object_clone_obj_t					clone_obj;
	/* individual object functions */
	zend_object_read_property_t				read_property;
	zend_object_write_property_t			write_property;
	zend_object_read_dimension_t			read_dimension;
	zend_object_write_dimension_t			write_dimension;
	zend_object_get_property_ptr_ptr_t		get_property_ptr_ptr;
	zend_object_get_t						get;
	zend_object_set_t						set;
	zend_object_has_property_t				has_property;
	zend_object_unset_property_t			unset_property;
	zend_object_has_dimension_t				has_dimension;
	zend_object_unset_dimension_t			unset_dimension;
	zend_object_get_properties_t			get_properties;
	zend_object_get_method_t				get_method;
	zend_object_call_method_t				call_method;
	zend_object_get_constructor_t			get_constructor;
	zend_object_get_class_entry_t			get_class_entry;
	zend_object_get_class_name_t			get_class_name;
	zend_object_compare_t					compare_objects;
	zend_object_cast_t						cast_object;
	zend_object_count_elements_t			count_elements;
	zend_object_get_debug_info_t			get_debug_info;
	zend_object_get_closure_t				get_closure;

}

這個結構體裏面實現了:長整型,雙精度浮點,字符串,hash表,還有對象(zend_object_value)。就是zval和pval兩個結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章