PHP7扩展开发之类型处理

前言

这次,我们将演示如何在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

更多函数说明请查看

时间: 2024-12-22 21:06:16

PHP7扩展开发之类型处理的相关文章

PHP7扩展开发之字符串处理

PHP7扩展开发之字符串处理 前言 这次,我们来看看字符串在PHP扩展里面如何处理. 示例代码如下: <?php function str_concat($prefix, $string) { $len = strlen($prefix); $substr = substr($string, 0, $len); if ($substr != $prefix) { return $prefix." ".$string; } else { return $string; } } ec

PHP7扩展开发之创建变量

前言 在这篇博文中我们将演示如何在PHP扩展中创建一个变量.示例代码如下: <?php class demo {} $lng = 2; $str = "abc"; $arr = array(1,'a' => 'b'); $obj = new demo(); var_dump($str); var_dump($arr); var_dump($obj); ?> 中间的三行我们将用PHP扩展来实现. 代码 基础代码 这个扩展,我们将在say扩展上增加 define_var

PHP7扩展开发之常量定义

前言 这次,我们将演示如何在PHP扩展中定义一个常量.要实现的PHP代码如下: <?php define("__ARR__", array('2', 'site'=>"www.bo56.com")); define("__SITE__", "www.bo56.com", true); define("say\__SITE__", "bo56.com"); var_dump(_

PHP7扩展开发之传参与返回值

前言 这次,我们将演示如何在PHP扩展中接受传入的参数和输出返回值. <?php function default_value ($type, $value = null) { if ($type == "int") { return $value ?? 0; } else if ($type == "bool") { return $value ?? false; } else if ($type == "str") { return i

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理.要实现的PHP代码如下: <?php function array_concat ($arr, $prefix) { foreach($arr as $key => $val) { if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) { $arr[$key] = $prefix[$key].$val; } }

白话PHP7扩展开发之创建对象

本篇文章主要将如何在扩展中创建一个对象.创建的对象的过程,其实和一个小孩出生,成长的过程有些类似. 第一步,办准生证 生孩子第一步,先办准生证.声明我要生孩子了.对象创建的时候,如何办准生证呢?只要定义一个zend_class_entry变量即可.代码如下: zend_class_entry ce; zend_class_entry 是啥?可以认为它使一个原型,定义了一些对象应该有哪些东西组成.具体代码可以查看./Zend/zend.h文件. 第二步,取名字 孩子怎么得有个名字,对象也一样.如何

PHP扩展迁移为PHP7扩展兼容性问题记录_php实例

PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容.有不少方法参数做了调整.下面是在迁移过程中遇到的一些问题.记录下来,避免大家再踩坑. add_assoc_stringl 方法参数改为四个. add_assoc_stringl(parray, key, value, value_len); 迁移的时候,只要把最后一个参数删除即可. add_assoc_string 方法参数从四个改为了三个. add_assoc_stringl(parray, key, value

PHP7扩展开发之hello word

本文是以PHP7作为基础,讲解如何从零开始创建一个PHP扩展.本文主要讲解创建一个扩展的基本步骤都有哪些.示例中,我们将实现如下功能: <?php echo say(); ?> 输出内容: $ php ./test.php $ hello word 在扩展中实现一个say方法,调用say方法后,输出 hello word. 扩展开发步骤 第一步:生成代码 PHP为我们提供了生成基本代码的工具 ext_skel.这个工具在PHP源代码的./ext目录下. $ cd php_src/ext/ $

PHP扩展开发教程(总结)_php实例

PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工程师来保证系统的稳定运行. 1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH()       void ***tsrm_ls = (void ***) ts_resource_ex(0, NULL) #define TSRMLS_FETCH_FR