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

更多函数说明请查看

目录
相关文章
|
6月前
|
安全 PHP
PHP 8 新特性实战:提升开发效率的利器
PHP 8 新特性实战:提升开发效率的利器
217 87
|
6月前
|
安全 PHP
PHP 8 新特性实战:提升开发效率的利器
PHP 8 新特性实战:提升开发效率的利器
228 88
|
6月前
|
安全 编译器 PHP
PHP 8 新特性:现代开发的强力引擎
PHP 8 新特性:现代开发的强力引擎
220 89
|
6月前
|
安全 编译器 PHP
PHP 8 新特性:现代化开发的飞跃
PHP 8 新特性:现代化开发的飞跃
314 89
|
6月前
|
安全 大数据 PHP
PHP 7+ 新特性实战指南:提升开发效率
PHP 7+ 新特性实战指南:提升开发效率
231 87
|
4月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
10月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
548 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
8月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
491 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
9月前
|
前端开发 PHP 开发者
Wordpress主题开发之index.php
本文介绍了 WordPress 主题开发中页面结构与模板文件的使用方法。通过 header.php、sidebar.php、footer.php 和 index.php 等模板文件,实现网站模块化设计,便于统一管理和代码重用。Header 部分包含 logo、导航条等;Content 展示主体内容;Side bar 显示推荐信息或广告;Footer 则呈现版权和备案信息等内容。文章还提供了各模板文件的具体代码示例,帮助开发者快速理解和应用 WordPress 模板机制。
255 9
|
9月前
|
API PHP 数据库
PhalApi 2.x:让PHP接口开发从“简单”到“极简”的开源框架
PhalApi 2.x 是一款专为接口开发设计的轻量级PHP框架,性能卓越且易于上手。它支持多协议、自动生成文档、提供多种客户端SDK,并采用现代化技术栈,适合中小型项目及微服务架构。通过清晰的分层架构和丰富的扩展库,开发者可快速构建高可用API。其日均超1000万次调用,广泛应用于移动App、物联网、电商等领域。官网:https://www.phalapi.net/,欢迎体验高效开发之旅!