<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 2.2 變量的值 # 2.2 變量的值 PHP內核提供了三個基礎宏來方便我們對變量的值進行操作,這幾個宏同樣以Z\_開頭,并且P結尾和PP結尾的同上一節中的宏一樣, 分別代表這參數是指針還是指針的指針。 此外,為了進一步方便我們的工作,內核中針對具體的數據類型分別定義了相應的宏。 如針對IS\_BOOL型的BVAL組合(Z\_BVAL、Z\_BVAL\_P、Z\_BVAL\_PP)和針對IS\_DOUBLE的DVAL組合(Z\_DVAL、ZDVAL\_P、ZDVAL\_PP)等等。 我們通過下面這個例子來應用一下這幾個宏: ``` void display_value(zval zv,zval *zv_p,zval **zv_pp) { if( Z_TYPE(zv) == IS_NULL ) { php_printf("類型是 IS_NULL!\n"); } if( Z_TYPE_P(zv_p) == IS_LONG ) { php_printf("類型是 IS_LONG,值是:%ld" , Z_LVAL_P(zv_p)); } if(Z_TYPE_PP(zv_pp) == IS_DOUBLE ) { php_printf("類型是 IS_DOUBLE,值是:%f" , Z_DVAL_PP(zv_pp) ); } } ``` string型變量比較特殊,因為內核在保存String型變量時,不僅保存了字符串的值,還保存了它的長度, 所以它有對應的兩種宏組合STRVAL和STRLEN,即:Z\_STRVAL、Z\_STRVAL\_P、Z\_STRVAL\_PP與Z\_STRLEN、Z\_STRLEN\_P、Z\_STRLEN\_PP。 前一種宏返回的是char \*型,即字符串的地址;后一種返回的是int型,即字符串的長度。 ``` void display_string(zval *zstr) { if (Z_TYPE_P(zstr) != IS_STRING) { php_printf("這個變量不是字符串!\n"); return; } PHPWRITE(Z_STRVAL_P(zstr), Z_STRLEN_P(zstr)); //這里用了PHPWRITE宏,只要知道它是從Z_STRVAL_P(zstr)地址開始,輸出Z_STRLEN_P(zstr)長度的字符就可以了。 } ``` Array型變量的值其實是存儲在C語言實現的HashTable中的, 我們可以用ARRVAL組合宏(Z\_ARRVAL, Z\_ARRVAL\_P, Z\_ARRVAL\_PP)這三個宏來訪問數組的值。 如果你看舊版本php的源碼或者部分pecl擴展的源碼,可能會發現一個HASH\_OF()宏,這個宏等價于Z\_ARRVAL\_P()。 但不推薦在新代碼中再使用了。 對象是一個復雜的結構體(zend\_object\_value結構體),不僅存儲屬性的定義、屬性的值,還存儲著訪問權限、方法等信息。 內核中定義了以下組合宏讓我們方便的操作對象: OBJ\_HANDLE:返回handle標識符, OBJ\_HT:handle表, OBJCE:類定義, OBJPROP:HashTable的屬性, OBJ\_HANDLER:在OBJ\_HT中操作一個特殊的handler方法。 現在不用擔心這些宏對象的意思,后續有專門的章節介紹object。 資源型變量的值其實就是一個整數,可以用RESVAL組合宏來訪問它,我們把它的值傳給zend\_fetch\_resource函數,便可以得到這個資源的操作句柄,如mysql的鏈接句柄等。有關資源的內容我們將在第9章展開敘述。 有關值操作的宏都定義在./Zend/zend\_operators.h文件里: ``` //操作整數的 #define Z_LVAL(zval) (zval).value.lval #define Z_LVAL_P(zval_p) Z_LVAL(*zval_p) #define Z_LVAL_PP(zval_pp) Z_LVAL(**zval_pp) //操作IS_BOOL布爾型的 #define Z_BVAL(zval) ((zend_bool)(zval).value.lval) #define Z_BVAL_P(zval_p) Z_BVAL(*zval_p) #define Z_BVAL_PP(zval_pp) Z_BVAL(**zval_pp) //操作浮點數的 #define Z_DVAL(zval) (zval).value.dval #define Z_DVAL_P(zval_p) Z_DVAL(*zval_p) #define Z_DVAL_PP(zval_pp) Z_DVAL(**zval_pp) //操作字符串的值和長度的 #define Z_STRVAL(zval) (zval).value.str.val #define Z_STRVAL_P(zval_p) Z_STRVAL(*zval_p) #define Z_STRVAL_PP(zval_pp) Z_STRVAL(**zval_pp) #define Z_STRLEN(zval) (zval).value.str.len #define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p) #define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp) #define Z_ARRVAL(zval) (zval).value.ht #define Z_ARRVAL_P(zval_p) Z_ARRVAL(*zval_p) #define Z_ARRVAL_PP(zval_pp) Z_ARRVAL(**zval_pp) //操作對象的 #define Z_OBJVAL(zval) (zval).value.obj #define Z_OBJVAL_P(zval_p) Z_OBJVAL(*zval_p) #define Z_OBJVAL_PP(zval_pp) Z_OBJVAL(**zval_pp) #define Z_OBJ_HANDLE(zval) Z_OBJVAL(zval).handle #define Z_OBJ_HANDLE_P(zval_p) Z_OBJ_HANDLE(*zval_p) #define Z_OBJ_HANDLE_PP(zval_p) Z_OBJ_HANDLE(**zval_p) #define Z_OBJ_HT(zval) Z_OBJVAL(zval).handlers #define Z_OBJ_HT_P(zval_p) Z_OBJ_HT(*zval_p) #define Z_OBJ_HT_PP(zval_p) Z_OBJ_HT(**zval_p) #define Z_OBJCE(zval) zend_get_class_entry(&(zval) TSRMLS_CC) #define Z_OBJCE_P(zval_p) Z_OBJCE(*zval_p) #define Z_OBJCE_PP(zval_pp) Z_OBJCE(**zval_pp) #define Z_OBJPROP(zval) Z_OBJ_HT((zval))->get_properties(&(zval) TSRMLS_CC) #define Z_OBJPROP_P(zval_p) Z_OBJPROP(*zval_p) #define Z_OBJPROP_PP(zval_pp) Z_OBJPROP(**zval_pp) #define Z_OBJ_HANDLER(zval, hf) Z_OBJ_HT((zval))->hf #define Z_OBJ_HANDLER_P(zval_p, h) Z_OBJ_HANDLER(*zval_p, h) #define Z_OBJ_HANDLER_PP(zval_p, h) Z_OBJ_HANDLER(**zval_p, h) #define Z_OBJDEBUG(zval,is_tmp) (Z_OBJ_HANDLER((zval),get_debug_info)? \ Z_OBJ_HANDLER((zval),get_debug_info)(&(zval),&is_tmp TSRMLS_CC): \ (is_tmp=0,Z_OBJ_HANDLER((zval),get_properties)?Z_OBJPROP(zval):NULL)) #define Z_OBJDEBUG_P(zval_p,is_tmp) Z_OBJDEBUG(*zval_p,is_tmp) #define Z_OBJDEBUG_PP(zval_pp,is_tmp) Z_OBJDEBUG(**zval_pp,is_tmp) //操作資源的 #define Z_RESVAL(zval) (zval).value.lval #define Z_RESVAL_P(zval_p) Z_RESVAL(*zval_p) #define Z_RESVAL_PP(zval_pp) Z_RESVAL(**zval_pp) ``` ## links - [目錄](preface.md) - 2.1 [變量的類型](2.1.html) - 2.3 [創建PHP變量](2.3.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看