前言
這次,我們將演示如何在PHP擴展中如何對類型進行一些操作通今。如琐簇,判斷變量類型。要實現(xiàn)的PHP代碼如下:
<?php
function get_size ($value) {
if (is_string($value)) {
return "string size is ". strlen($value);
} else if (is_array($value)) {
return "array size is ". sizeof($value);
} else {
return "can not support";
}
}
var_dump(get_size("abc"));
var_dump(get_size(array(1,2)));
?>
分別獲取string 和 array的長度头朱。
代碼
基礎代碼
這個擴展运悲,我們將在say擴展上增加 get_size
方法。say擴展相關代碼大家請看這篇博文项钮。PHP7擴展開發(fā)之hello word 文中已經(jīng)詳細介紹了如何創(chuàng)建一個擴展和提供了源碼下載班眯。
實現(xiàn)get_size方法
get_size方法的PHP擴展源碼:
PHP_FUNCTION(get_size)
{
zval *val;
size_t size;
char *result;
HashTable *myht;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &val) == FAILURE) {
return;
}
result = emalloc(1024);
if (Z_TYPE_P(val) == IS_STRING) {
size = php_sprintf(result, "string size is %d", Z_STRLEN_P(val));
} else if (Z_TYPE_P(val) == IS_ARRAY) {
myht = Z_ARRVAL_P(val);
size = php_sprintf(result, "array size is %d", zend_array_count(myht));
} else {
size = php_sprintf(result, "can not support");
}
RETVAL_STRINGL(result, size);
efree(result);
}
代碼解讀
zval變量相關的宏方法大部分定義在Zend/zend_types.h
文件中希停。
代碼所涉及宏方法含義:
Z_TYPE_P 獲取zval變量的類型。
Z_STRLEN_P 獲取字符串的長度署隘。
zend_array 和 HashTable其實是相同的數(shù)據(jù)結構宠能。在Zend/zend_types.h
文件中有定義。
typedef struct _zend_array HashTable;
在 Zend/zend_hash.c
文件中包含一些array處理的方法磁餐。如:
zend_array_count