美文网首页
PHP7扩展开发之类型处理

PHP7扩展开发之类型处理

作者: 信海龙 | 来源:发表于2016-11-05 07:56 被阅读92次

    前言

    这次,我们将演示如何在PHP扩展中如何对类型进行一些操作。如,判断变量类型。要实现的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扩展开发之hello word 文中已经详细介绍了如何创建一个扩展和提供了源码下载。

    实现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其实是相同的数据结构。在Zend/zend_types.h文件中有定义。

        typedef struct _zend_array HashTable;
    

    Zend/zend_hash.c文件中包含一些array处理的方法。如:
    zend_array_count

    更多函数说明请查看

    源码下载

    tar.gz格式下载
    zip格式下载

    相关文章

      网友评论

          本文标题:PHP7扩展开发之类型处理

          本文链接:https://www.haomeiwen.com/subject/uynwuttx.html