<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • php語法基礎知識(php簡單的管理系統操作)


    說明

    這里基于php7.2.5進行測試,php7之后內部結構變化應該不是太大,但與php5.X有差別。

    使用

    變量聲明及使用

    $a = "hello"; // string
    echo is_string($a); // 1
    $b = 1; // int
    echo is_int($b); // 1
    $c = [1]; // array
    $d = true; // bool

    弱類型

    區別于C/JAVA/GO等強類型語言,PHP在聲明變量的時候不需要指定變量的類型,代碼在執行的時候會自動去解析變量的類型。

    如何實現

    存儲變量的底層結構zval、zend_value(zend_types.h)

    
    struct _zval_struct {
    	zend_value        value;			/* value 變量值放在這里 */
    	union {
    		struct {
    			ZEND_ENDIAN_LOHI_4(
    				zend_uchar    type,			/* active type 變量類型  stirng/true/false/array */
    				zend_uchar    type_flags,
    				zend_uchar    const_flags,
    				zend_uchar    reserved)	    /* call info for EX(This) */
    		} v;
    		uint32_t type_info;
    	} u1;
    	union {
    		uint32_t     next;                 /* hash collision chain */
    		uint32_t     cache_slot;           /* literal cache slot */
    		uint32_t     lineno;               /* line number (for ast nodes) */
    		uint32_t     num_args;             /* arguments number for EX(This) */
    		uint32_t     fe_pos;               /* foreach position */
    		uint32_t     fe_iter_idx;          /* foreach iterator index */
    		uint32_t     access_flags;         /* class constant access flags */
    		uint32_t     property_guard;       /* single property guard */
    		uint32_t     extra;                /* not further specified */
    	} u2;
    };
    
    // zend_value
    typedef union _zend_value {
    	zend_long         lval;				/* long value 這里存儲int的值 */
    	double            dval;				/* double value */
    	zend_refcounted  *counted; /* 引用計數 用于垃圾回收 */
    	zend_string      *str; /* 字符串 */
    	zend_array       *arr;
    	zend_object      *obj;
    	zend_resource    *res;
    	zend_reference   *ref;
    	zend_ast_ref     *ast;
    	zval             *zv;
    	void             *ptr;
    	zend_class_entry *ce;
    	zend_function    *func;
    	struct {
    		uint32_t w1;
    		uint32_t w2;
    	} ww;
    } zend_value;
    
    
    // zval.u1.v1.type的類型的定義
    /* regular data types */
    #define IS_UNDEF					0
    #define IS_NULL						1 空 
    #define IS_FALSE					2 false
    #define IS_TRUE						3
    #define IS_LONG						4
    #define IS_DOUBLE					5
    #define IS_STRING					6 字符串
    #define IS_ARRAY					7
    #define IS_OBJECT					8
    #define IS_RESOURCE					9
    #define IS_REFERENCE				10
    
    /* constant expressions */
    #define IS_CONSTANT					11
    #define IS_CONSTANT_AST				12
    
    /* fake types */
    #define _IS_BOOL					13
    #define IS_CALLABLE					14
    #define IS_ITERABLE					19
    #define IS_VOID						18
    
    /* internal types */
    #define IS_INDIRECT             	15
    #define IS_PTR						17
    #define _IS_ERROR					20

    我們可以先看一下zval.u1.v.type 與 zend_value其他的元素可以暫時忽略。

    zval是存放變量的結構體,變量的值則放在zend_value中,zend_value是一個union類型,也就是共用體,特點就是可以存放多種類型的數據,但同時只有一個種類型可以有值。

    $a = "hello";

    那么PHP代碼在編譯、執行的時候通過詞法語法解析,將值1生成一個zval結構體,zval.u1.type就是IS_STRING類型,值存儲在zend_value中的str也就是zend_string中。

    總結

    弱類型的實現是基于zend_value共用體實現,變量類型在代碼解析的時候根據語法去解析生成的。

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费