PHP7扩展开发之类型处理-阿里云开发者社区

开发者社区> exinnet> 正文

PHP7扩展开发之类型处理

简介: # 前言 这次,我们将演示如何在PHP扩展中如何对类型进行一些操作。如,判断变量类型。要实现的PHP代码如下: ```php ``` 分别获取string 和 array的长度。 # 代码 ## 基础代码 这个扩展,我们将在say扩展上增加 ``get_size`` 方法。say扩展相关代码大家请看这篇博文。[PHP7扩展开发之hello word](http:/
+关注继续查看

前言

这次,我们将演示如何在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;
    zend_string *result;
    HashTable *myht;

    if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &val) == FAILURE) {
        return;
    }   

    if (Z_TYPE_P(val) == IS_STRING) {
        result = strpprintf(0, "string size is %d", Z_STRLEN_P(val));
    } else if (Z_TYPE_P(val) == IS_ARRAY) {
        myht = Z_ARRVAL_P(val);
        result = strpprintf(0, "array size is %d", zend_array_count(myht));
    } else {
        result = strpprintf(0, "can not support");
    }   
        
    RETURN_STR(result);
}

代码说明

zval变量相关的宏方法大部分定义在Zend/zend_types.h文件中。

类型相关宏方法

Z_TYPE_P(zval *) 获取zval变量的类型。常见的类型都有:

#define IS_UNDEF                    0
#define IS_NULL                     1
#define IS_FALSE                    2
#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

Z_STRLEN_P(zval *) 获取字符串的长度。

数组

Zend/zend_hash.c文件中包含一些array处理的方法。
zend_array_count(HashTable *) 获取数组的元素个数。
zend_array 和 HashTable其实是相同的数据结构。在Zend/zend_types.h文件中有定义。

typedef struct _zend_array HashTable;

字符串拼接

strpprintf是PHP为我们提供的字符串拼接的方法。第一个参数是最大字符数。

PHP7变量相关资料

在PHP7中对于zval变量的结构有了不小的改动。大家可以查看下面三篇文章。介绍的比较详细。
https://github.com/laruence/php7-internal/blob/master/zval.md
http://0x1.im/blog/php/Internal-value-representation-in-PHP-7-part-1.html
http://0x1.im/blog/php/Internal-value-representation-in-PHP-7-part-2.html

更多函数说明请查看

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[git] warning: LF will be replaced by CRLF | fatal: CRLF would be replaced by LF[ git 处理和修改行结束符(CRLF和LF)]
  我自己的设置是: [core] autocrlf = false[core] safecrlf = true 取消自动转换CRLF(上图中选的是commit as is),但是有提交前混用检查 本人用的是WINDOWS下的PHPSTORM开发的PHP       遇到这两个错误,是因为Git的换行符检查功能。
1096 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
7251 0
php异常处理
 项目中遇到一个问题,类中调用方法未带参数,方法定义是带 一个参数,导致执行类中调用方法时报错,导致判断时永远为false。 简单示例如下:最后输出系统waring警告和 error。顺序执行完毕,未执行catach部分。
625 0
开放搜索文档处理示例教程
在进行开发搜索SDK的使用过程中,主要的查询分析目前官方已经有相对完整的示例教程,此处不再赘述。这里主要介绍一下如何使用SDK上传,更新及删除文档数据。
1180 0
php 发送超大数据处理
set_time_limit(0);//设置永不超时 ignore_user_abort(); //设置客户端断开,继续处理 //总数 $allusercount= $this->gamedb_model->query_onerow(); $allcoun...
565 0
php中不同方法中同名方法的处理
近日查看codeigniter源码,发现其helper类可以自定义方法,从而对系统helper方法进行扩展或重写。 CI  herper类介绍http://codeigniter.org.cn/user_guide/general/helpers.html 对于类可以继承实现方法的重写或扩展,对于方法可以吗?于是做了一下尝试 创建两个引用文件,里面有一个同名方法。
754 0
php读取xml 数据库字段超长处理
今天换了新机器,重新安装好开发环境。 在调用数据库(sqlserver)读取xml时解析异常,原以为是xmldom调用错误,后来自己手工编写的xml可以正常解析。 在php5以后使用xmldom不需要引用额外扩展了 查看php.
739 0
+关注
exinnet
淘宝技术专家
91
文章
70
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载