文档章节

尝试将Kohana框架转为C扩展-Kohana_Arr类实现主要代码

朱宗鑫1
 朱宗鑫1
发布于 2011/05/19 21:18
字数 617
阅读 237
收藏 1
点赞 0
评论 0
/* {{{ static Kohana_Arr Kohana_Arr::is_assoc([array array])
 */
PHP_METHOD(Kohana_Arr, is_assoc) {
    zval *array = NULL;

    if (ZEND_NUM_ARGS() != 1) {
        WRONG_PARAM_COUNT;
    }

    if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array)) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d should be an array", 1);
        RETURN_FALSE;
    }

    if (kohana_arr_is_assoc(array) == SUCCESS) {
        RETURN_TRUE;
    } else {
        RETURN_FALSE;
    }

    //*return_value = *array;
    RETURN_ZVAL(array, 1, 0);
}
/* }}} */

/* {{{ static Kohana_Arr Kohana_Arr::is_array([mixed value])
 */
PHP_METHOD(Kohana_Arr, is_array) {
    zval *value = NULL;

    if (ZEND_NUM_ARGS() != 1) {
        WRONG_PARAM_COUNT;
    }

    if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value)) {
        RETURN_FALSE;
    }

    if (SUCCESS != kohana_arr_is_array(value)) {
        RETURN_FALSE;
    }
    RETURN_TRUE;
}


/* }}} */



PHP_METHOD(Kohana_Arr, path) {
    zval *array = NULL;
    zval *path = NULL;
    zval *defaultvalue = NULL;
    zval *delim = NULL;
    if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 4) {
        WRONG_PARAM_COUNT;
    }
    if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz|zz", &array, &path, &defaultvalue, &delim)) {
        RETURN_ZVAL(defaultvalue, 1, 0);
    }

    if (SUCCESS != kohana_arr_is_array(array)) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d should be an array", 1);
        RETURN_ZVAL(defaultvalue, 1, 0);
    }
    if (defaultvalue == NULL) {
        MAKE_STD_ZVAL(defaultvalue);
        ZVAL_NULL(defaultvalue);
    }

    if (delim == NULL) {
        MAKE_STD_ZVAL(delim);
        ZVAL_NULL(delim);
    }
    if (Z_TYPE_P(delim) == IS_NULL) {
        Z_STRLEN_P(delim) = sizeof (KOHANA_ARR_DELIMITER) - 1;
        Z_STRVAL_P(delim) = estrdup(KOHANA_ARR_DELIMITER);
    }
    kohana_arr_path(array, path, delim, defaultvalue, return_value TSRMLS_DC);
}

PHP_METHOD(Kohana_Arr, set_path) {
    zval *array = NULL;
    zval *path = NULL;
    zval *value = NULL;
    zval *delim = NULL;
    if (ZEND_NUM_ARGS() < 3 || ZEND_NUM_ARGS() > 4) {
        WRONG_PARAM_COUNT;
    }

    if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zzz|z", &array, &path, &value, &delim)) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not enough arguments");
        RETURN_FALSE;
    }

    if (SUCCESS != kohana_arr_is_array(array)) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d should be an array", 1);
        RETURN_FALSE;
    }

    if (delim == NULL) {
        MAKE_STD_ZVAL(delim);
        ZVAL_NULL(delim);
    }
    if (Z_TYPE_P(delim) == IS_NULL) {
        Z_STRLEN_P(delim) = sizeof (KOHANA_ARR_DELIMITER) - 1;
        Z_STRVAL_P(delim) = estrdup(KOHANA_ARR_DELIMITER);
    }
    kohana_arr_set_path(array, path, value, delim);
    RETURN_TRUE;
}

PHP_METHOD(Kohana_Arr, range) {
    int step = 0;
    int max = 0;
    if (ZEND_NUM_ARGS() > 2) {
        WRONG_PARAM_COUNT;
    }

    if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &step, &max)) {
        RETURN_FALSE;
    }

    zval *array = NULL;
    MAKE_STD_ZVAL(array);
    array_init(array);
    if (step < 0) {
        RETURN_ZVAL(array, 1, 0);
    }

    int i;
    for (i = step; i <= max; i += step) {
        add_index_long(array, i, i);
    }

    RETURN_ZVAL(array, 1, 0);
}

PHP_METHOD(Kohana_Arr, get) {
    zval *array = NULL;
    zval *key = NULL;
    zval *defualt = NULL;
    if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 3) {
        WRONG_PARAM_COUNT;
    }

    if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz|z", &array, &key, &defualt)) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not enough arguments");
        RETURN_FALSE;
    }

    if (SUCCESS != kohana_arr_is_array(array)) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d should be an array", 1);
        RETURN_FALSE;
    }

    if (defualt == NULL) {
        MAKE_STD_ZVAL(defualt);
        ZVAL_NULL(defualt);
    }

    convert_to_string(key);

    ulong idx = 0;
    zval **findvalue;
    if (ctype_digit(key) == SUCCESS) {
        idx = atol(Z_STRVAL_P(key));
        if (zend_hash_index_find(Z_ARRVAL_P(array), idx, (void **) &findvalue) == SUCCESS) {
            RETURN_ZVAL(*findvalue, 1, 0);
        }
    } else {
        if (zend_hash_find(Z_ARRVAL_P(array), Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **) &findvalue) == SUCCESS) {
            RETURN_ZVAL(*findvalue, 1, 0);
        }
    }
    RETURN_ZVAL(defualt, 1, 0);
}



PHP_METHOD(Kohana_Arr, extract) {
    zval *array = NULL;
    zval *keys = NULL;
    zval *defualt = NULL;
    if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 3) {
        WRONG_PARAM_COUNT;
    }

    if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz|z", &array, &keys, &defualt)) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not enough arguments");
        RETURN_FALSE;
    }

    if (SUCCESS != kohana_arr_is_array(array)) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d should be an array", 1);
        RETURN_FALSE;
    }

    if (Z_TYPE_P(keys) != IS_ARRAY) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d should be an array", 2);
        RETURN_FALSE;
    }

    if (defualt == NULL) {
        MAKE_STD_ZVAL(defualt);
        ZVAL_NULL(defualt);
    }

    zval *found = NULL;
    MAKE_STD_ZVAL(found);
    array_init(found);

    zval **key;
    HashPosition pos;

    zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(keys), &pos);
    while (zend_hash_get_current_data_ex(Z_ARRVAL_P(keys), (void **) &key, &pos) == SUCCESS) {
        convert_to_string(*key);

        zval **findvalue;
        if (ctype_digit(*key) == SUCCESS) {
            ulong idx = atol(Z_STRVAL_P(*key));
            if (zend_hash_index_find(Z_ARRVAL_P(array), idx, (void **) &findvalue) == SUCCESS) {
                add_index_zval(found, idx, *findvalue);
            } else {
                add_index_zval(found, idx, defualt);
            }
        } else {
            if (zend_hash_find(Z_ARRVAL_P(array), Z_STRVAL_P(*key), Z_STRLEN_P(*key) + 1, (void **) &findvalue) == SUCCESS) {

                //add_assoc_zval(found, key, *findvalue);
                add_assoc_zval_ex(found, Z_STRVAL_P(*key), Z_STRLEN_P(*key) + 1, *findvalue);
            } else {
                //add_assoc_zval(found, key, defualt);
                add_assoc_zval_ex(found, Z_STRVAL_P(*key), Z_STRLEN_P(*key) + 1, defualt);
            }
        }

        zend_hash_move_forward_ex(Z_ARRVAL_P(keys), &pos);

    }
    RETURN_ZVAL(found, 1, 0);
}

Phalcon 的数组助手就用到了这部分代码

© 著作权归作者所有

共有 人打赏支持
朱宗鑫1
粉丝 26
博文 28
码字总数 4018
作品 1
杭州
架构师
面向对象陷阱 -- 从CI --> Kohana -->None

决定抛弃Java, 采用PHP的时候, 对PHP不算特别了解, 所以需要一些Best Practice来参考,看看如何用好这个语言. 在这个过程中, 评估试用了包括但不仅限于: Symphony, YII, CI, Kohana......... ...

宏哥 ⋅ 2012/10/27 ⋅ 14

成立开源项目kohanaforext

地址:http://code.google.com/p/kohanaforext/ 将kohana转为C扩展,发挥PHP的速度极限。

朱宗鑫1 ⋅ 2011/05/31 ⋅ 0

Kohana框架学习

Kohana加载model example: model: <?php defined('SYSPATH') or die('No direct script access.'); class ModelInterface extends Model { /* @param $eventid 事件ID; $arr 要写入的数据;......

Zhaozk ⋅ 2013/07/15 ⋅ 0

Kohana的网友评论

kohana是一个基于MVC模型构建的PHP5框架,它的目标旨在安全,重量轻,且易于使用。 特点: 1。严谨的PHP5面向对象编程。优势:可见性保护,自动加载,重载,接口,抽象类,单一模式等。 2。社...

红薯 ⋅ 2009/12/11 ⋅ 6

PHP5 框架 Kohana 走到生命尽头 将于7月1日结束支持

Kohana 框架的主要开发者 shadowhand 此前早已在 Kohana 的官方论坛公布 Kohana 将于 2017 年 7 月 1 日正式结束支持。其中,Kohana 的官网、论坛以及 GitHub 仓库也将在当日正式下线。 shad...

figochen ⋅ 2017/04/08 ⋅ 7

Kohana V3.10 新版面目全非

三天前,Kohana V3 分支发布了 3.10 新版。让人恶心的是,Request 类已经变得面目全非,新增加了 Response 类代替了原来的简单 Response 文本流。 具体改动请见 V3.1.0 ChangeLog ,给我个人...

ValueError ⋅ 2011/02/10 ⋅ 6

2014年为您细数PHP框架排行榜Top 10

  【IT168 评论】PHP 框架是非常有用的工具,可以帮助开发者构建干净整洁和结构化的 web 开发,同时也加快了创建和维护 web 应用的速度。在这里,我们会介绍排名前 10 并且最受欢迎的 PHP ...

开源中国 ⋅ 2014/01/13 ⋅ 0

2014 年 TOP 10 的 PHP 框架

PHP 框架是非常有用的工具,可以帮助开发者构建干净整洁和结构化的 web 开发,同时也加快了创建和维护 web 应用的速度。在这里,我们会介绍排名前 10 并且最受欢迎的 PHP 框架(排名不分先后...

oschina ⋅ 2014/01/12 ⋅ 88

PHP 5 框架--Kohana

Kohana 是一个基于 MVC 模型构建的 PHP 5 框架,纯 PHP 开发。它的目标旨在安全,轻量级,且易于使用。 特点: 严谨的 PHP5 面向对象编程。优势:可见性保护,自动加载,重载,接口,抽象类,...

匿名 ⋅ 2009/02/24 ⋅ 4

Kohana 3.2 分支发布

PHP 框架 Kohana 的 3.x 分支一直更新很频繁,自从上次从 3.0x 到 3.1x 的大幅度 API 变动后,更新主要就集中在 3.1x。而该框架的 3.20 版本已于本月 24 日发布,3.2x 分支宣告进入主干。与此...

ValueError ⋅ 2011/07/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

vim编辑模式、vim命令模式、vim实践

vim编辑模式 编辑模式用来输入或修改文本内容,编辑模式除了Esc外其他键几乎都是输入 如何进入编辑模式 一般模式输入以下按键,均可进入编辑模式,左下角提示 insert(中文为插入) 字样 i ...

蛋黄Yolks ⋅ 昨天 ⋅ 0

大数据入门基础:SSH介绍

什么是ssh 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码...

董黎明 ⋅ 昨天 ⋅ 0

web3j教程

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 汇智网最新发布的web3j教程,详细讲解...

汇智网教程 ⋅ 昨天 ⋅ 0

谷歌:安全问题机制并不如你想象中安全

腾讯科技讯 5月25日,如今的你或许已经对许多网站所使用的“安全问题机制”习以为常了,但你真的认为包括“你第一个宠物的名字是什么?”这些问题能够保障你的帐户安全吗? 根据谷歌(微博)安...

问题终结者 ⋅ 昨天 ⋅ 0

聊聊spring cloud gateway的RedisRateLimiter

序 本文主要研究下spring cloud gateway的RedisRateLimiter GatewayRedisAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/gateway/con......

go4it ⋅ 昨天 ⋅ 0

169. Majority Element - LeetCode

Question 169. Majority Element Solution 思路:构造一个map存储每个数字出现的次数,然后遍历map返回出现次数大于数组一半的数字. 还有一种思路是:对这个数组排序,次数超过n/2的元素必然在中...

yysue ⋅ 昨天 ⋅ 0

NFS

14.1 NFS介绍 NFS是Network File System的缩写 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导开发,最新为4.1版本 NFS数据传输基于RPC协议,RPC...

派派菠菜 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部