PHP是弱類型的啦辐,但在C這層,假設(shè)現(xiàn)在已經(jīng)接收了參數(shù)慷暂,是要做參數(shù)類型判斷的聘殖。
很簡單 zval->type == "IS_BOOL" 晨雳。沒錯,更正確的方法應(yīng)該是用宏奸腺。 類似許多工作餐禁,PHP已經(jīng)做了大量的宏。
獲取變量的類型 :?
Z_TYPE() ,Z_TYPE_P(),Z_TYPE_PP() ,分別是獲取變量類型突照,獲取變量類型指針帮非,指針的指針。(Zend/zend_operators.h)
void func(zval *foo){
? if(Z_TYPE_P(foo) == "IS_BOOL"){
? ? ? php_printf("這個變量的數(shù)據(jù)類型是: BOOL");
? ?}
}
數(shù)據(jù)創(chuàng)建:
c分配內(nèi)存:malloc(sizeof(zval))
正確應(yīng)該是用宏:MAKE_STD_ZVAL(pzv) ?讹蘑。這個宏已優(yōu)化的方式處理分配內(nèi)存末盔,并且自動處理內(nèi)存錯誤。
ALLOC_INIT_ZVAL()與MAKE_STD_ZVAL(pzv)唯一區(qū)別是座慰,第一者會將zval*數(shù)據(jù)初始化為IS_NULL陨舱。
ZVAL_NULL(pvz); ? ? ? ? Z_TYPE_P(pzv) = IS_NULL;
ZVAL_LONG(pzv, l); Z_TYPE_P(pzv) = IS_LONG;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Z_LVAL_P(pzv) = l;
ZVAL_TRUE(pzv); ? ?ZVAL_BOOL(pzv, 1);
ZVAL_FALSE(pzv); ? ZVAL_BOOL(pzv, 0);
ZVAL_BOOL(pzv, b);? ? Z_TYPE_P(pzv) = IS_BOOL;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Z_BVAL_P(pzv) = b ? 1 : 0;
ZVAL_DOUBLE(pzv, d);? ? ? ? ? Z_TYPE_P(pzv) = IS_DOUBLE;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ZVAL_DOUBLE(pzv, d); ? ? ? ? ?
Z_DVAL_P(pzv) = d;