zoukankan      html  css  js  c++  java
  • 学习PHP C扩展之面向对象开发方式 (转)

    PHP OOP面向对象之C语言开发方式

    学习PHP C扩展有一段时间了,PHP手册里大部分讲的PHP的函数开发方式,网上找OOP资料比较少,想起上个月测试redis 的时候,下载PHP扩展redis源代码是OOP方式的。所以拿来练练手,其它不说了开始

    下面要扩展的代码是 ModelHelper.php

    < ?php
    /**
     * 助手类,用于放置需要使用的公共函数和常量
     *
     */
    class ModelHelper {
            static public function escapePage($page)
            {
                return max(1, intval($page));
            }
            /*
             * 返回基于当前时间的唯一MD5哈希值
             */
            static public function uuid()
            {
                return md5(rand());
            }
    }
    ?>

    然入 php源代码 extext_skel –extname=ModelHelper 下面是进行修改的c代码

    ModelHelper.c

    /*
      +----------------------------------------------------------------------+
      | PHP Version 5                                                        |
      +----------------------------------------------------------------------+
      | Copyright (c) 1997-2007 The PHP Group                                |
      +----------------------------------------------------------------------+
      | This source file is subject to version 3.01 of the PHP license,      |
      | that is bundled with this package in the file LICENSE, and is        |
      | available through the world-wide-web at the following url:           |
      | http://www.php.net/license/3_01.txt                                  |
      | If you did not receive a copy of the PHP license and are unable to   |
      | obtain it through the world-wide-web, please send a note to          |
      | license@php.net so we can mail you a copy immediately.               |
      +----------------------------------------------------------------------+
      | Author:                                                              |
      +----------------------------------------------------------------------+
    */
     
    /* $Id: header 226204 2007-01-01 19:32:10Z iliaa $ */
     
    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
     
    #include "php.h"
    #include "php_ini.h"
    #include "ext/standard/info.h"
    #include "php_ModelHelper.h"
    #include "ext/standard/php_standard.h"
    #include   <zend_exceptions .h>
    #define MAX(a, b)  (((a)>(b))?(a):(b))
     
    /* If you declare any globals in php_ModelHelper.h uncomment this:
    ZEND_DECLARE_MODULE_GLOBALS(ModelHelper)
    */
     
     
    /* True global resources - no need for thread safety here */
    static int le_ModelHelper;
     
    static zend_class_entry *ModelHelper_ce;
    static zend_class_entry *ModelHelper_exception_ce;
    static zend_class_entry *spl_ce_RuntimeException = NULL;
     
     
    /* {{{ ModelHelper_functions[]
     *
     * Every user visible function must have an entry in ModelHelper_functions[].
     */
    static zend_function_entry ModelHelper_functions[] = {
         PHP_ME(ModelHelper,escapePage, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
         PHP_ME(ModelHelper,uuid, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
         /* For testing, remove later. */
        {NULL, NULL, NULL}    /* Must be the last line in ModelHelper_functions[] */
    };
    /* }}} */
     
    /* {{{ ModelHelper_module_entry
     */
    zend_module_entry ModelHelper_module_entry = {
    #if ZEND_MODULE_API_NO >= 20010901
        STANDARD_MODULE_HEADER,
    #endif
        "ModelHelper",
        ModelHelper_functions,
        PHP_MINIT(ModelHelper),
        PHP_MSHUTDOWN(ModelHelper),
        PHP_RINIT(ModelHelper),        /* Replace with NULL if there's nothing to do at request start */
        PHP_RSHUTDOWN(ModelHelper),    /* Replace with NULL if there's nothing to do at request end */
        PHP_MINFO(ModelHelper),
    #if ZEND_MODULE_API_NO >= 20010901
        "0.1", /* Replace with version number for your extension */
    #endif
        STANDARD_MODULE_PROPERTIES
    };
    /* }}} */
     
    #ifdef COMPILE_DL_MODELHELPER
    ZEND_GET_MODULE(ModelHelper)
    #endif
     
    /* {{{ PHP_INI
     */
    /* Remove comments and fill if you need to have entries in php.ini
    PHP_INI_BEGIN()
        STD_PHP_INI_ENTRY("ModelHelper.global_value",      "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_ModelHelper_globals, ModelHelper_globals)
        STD_PHP_INI_ENTRY("ModelHelper.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_ModelHelper_globals, ModelHelper_globals)
    PHP_INI_END()
    */
    /* }}} */
     
    /* {{{ php_ModelHelper_init_globals
     */
    /* Uncomment this function if you have INI entries
    static void php_ModelHelper_init_globals(zend_ModelHelper_globals *ModelHelper_globals)
    {
        ModelHelper_globals->global_value = 0;
        ModelHelper_globals->global_string = NULL;
    }
    */
    /* }}} */
     
     
     
     
    /* {{{ PHP_MINIT_FUNCTION
     */
    PHP_MINIT_FUNCTION(ModelHelper)
    {
        /* If you have INI entries, uncomment these lines 
        REGISTER_INI_ENTRIES();
        */
     
       zend_class_entry ModelHelper_class_entry;
       INIT_CLASS_ENTRY(ModelHelper_class_entry, "ModelHelper", ModelHelper_functions);
       ModelHelper_ce = zend_register_internal_class(&ModelHelper_class_entry TSRMLS_CC);
       return SUCCESS;
    }
    /* }}} */
     
    /* {{{ PHP_MSHUTDOWN_FUNCTION
     */
    PHP_MSHUTDOWN_FUNCTION(ModelHelper)
    {
        /* uncomment this line if you have INI entries
        UNREGISTER_INI_ENTRIES();
        */
        return SUCCESS;
    }
    /* }}} */
     
    /* Remove if there's nothing to do at request start */
    /* {{{ PHP_RINIT_FUNCTION
     */
    PHP_RINIT_FUNCTION(ModelHelper)
    {
        return SUCCESS;
    }
    /* }}} */
     
    /* Remove if there's nothing to do at request end */
    /* {{{ PHP_RSHUTDOWN_FUNCTION
     */
    PHP_RSHUTDOWN_FUNCTION(ModelHelper)
    {
        return SUCCESS;
    }
    /* }}} */
     
    /* {{{ PHP_MINFO_FUNCTION
     */
    PHP_MINFO_FUNCTION(ModelHelper)
    {
        php_info_print_table_start();
        php_info_print_table_header(2, "ModelHelper support", "enabled");
        php_info_print_table_row(2, "URL", "http://www.hucde.com");
        php_info_print_table_row(2, "author", "Summer.Hu");
        php_info_print_table_end();
     
        /* Remove comments if you have entries in php.ini
        DISPLAY_INI_ENTRIES();
        */
    }
    /* }}} */
     
     
     
    PHP_METHOD(ModelHelper,escapePage)
    {
        long return_i;
        zval **n;
        if (zend_get_parameters_ex(1, &n) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
     
        convert_to_long_ex(n);
        return_i=MAX(1,Z_LVAL_PP(n));
        RETURN_LONG(return_i);
        //convert_to_long_base(return_value, 10);
    }
     
     
    PHP_METHOD(ModelHelper,uuid)
    {
        long number;
        number = php_rand(TSRMLS_C);
        PHP_MD5_CTX context;
        unsigned char digest[16];
        char md5str[33];
        char string_number[25];
        int len;
        char *strg;
        len = spprintf(&strg, 0, "%u",number);
        PHP_MD5Init(&context);
        PHP_MD5Update(&context,strg,len);
        PHP_MD5Final(digest, &context);
        make_digest(md5str, digest);
        RETVAL_STRING(md5str, 1);
    }
    </zend_exceptions>

    php_ModelHelper.h 的头文件

    /*
      +----------------------------------------------------------------------+
      | PHP Version 5                                                        |
      +----------------------------------------------------------------------+
      | Copyright (c) 1997-2007 The PHP Group                                |
      +----------------------------------------------------------------------+
      | This source file is subject to version 3.01 of the PHP license,      |
      | that is bundled with this package in the file LICENSE, and is        |
      | available through the world-wide-web at the following url:           |
      | http://www.php.net/license/3_01.txt                                  |
      | If you did not receive a copy of the PHP license and are unable to   |
      | obtain it through the world-wide-web, please send a note to          |
      | license@php.net so we can mail you a copy immediately.               |
      +----------------------------------------------------------------------+
      | Author:                                                              |
      +----------------------------------------------------------------------+
    */
     
    /* $Id: header 226204 2007-01-01 19:32:10Z iliaa $ */
     
    #ifndef PHP_MODELHELPER_H
    #define PHP_MODELHELPER_H
     
    extern zend_module_entry ModelHelper_module_entry;
    #define phpext_ModelHelper_ptr &ModelHelper_module_entry
     
    #ifdef PHP_WIN32
    #define PHP_MODELHELPER_API __declspec(dllexport)
    #else
    #define PHP_MODELHELPER_API
    #endif
     
    #ifdef ZTS
    #include "TSRM.h"
    #endif
     
    PHP_MINIT_FUNCTION(ModelHelper);
    PHP_MSHUTDOWN_FUNCTION(ModelHelper);
    PHP_RINIT_FUNCTION(ModelHelper);
    PHP_RSHUTDOWN_FUNCTION(ModelHelper);
    PHP_MINFO_FUNCTION(ModelHelper);
     
    PHP_METHOD(ModelHelper,escapePage);
    PHP_METHOD(ModelHelper,uuid);
    /* For testing, remove later. */
     
    /* 
          Declare any global variables you may need between the BEGIN
        and END macros here:     
     
    ZEND_BEGIN_MODULE_GLOBALS(ModelHelper)
        long  global_value;
        char *global_string;
    ZEND_END_MODULE_GLOBALS(ModelHelper)
    */
     
    /* In every utility function you add that needs to use variables 
       in php_ModelHelper_globals, call TSRMLS_FETCH(); after declaring other 
       variables used by that function, or better yet, pass in TSRMLS_CC
       after the last function argument and declare your utility function
       with TSRMLS_DC after the last declared argument.  Always refer to
       the globals in your function as MODELHELPER_G(variable).  You are 
       encouraged to rename these macros something shorter, see
       examples in any other php module directory.
    */
     
    #ifdef ZTS
    #define MODELHELPER_G(v) TSRMG(ModelHelper_globals_id, zend_ModelHelper_globals *, v)
    #else
    #define MODELHELPER_G(v) (ModelHelper_globals.v)
    #endif
     
    #endif    /* PHP_MODELHELPER_H */
     
     
    /*
     * Local variables:
     * tab- 4
     * c-basic-offset: 4
     * End:
     * vim600: noet sw=4 ts=4 fdm=marker
     * vim&lt;600: noet sw=4 ts=4
     */

    然后编译,生成后输入 phpinfo.php 找到ModelHelper

    编译成功,然后输入测试一下:

    < ?
    //$obj=new ModelHelper();
    //echo $obj->escapePage(5);
    //echo $obj->escapePage(-1);
    //echo  echo qsyhcd_md5();
    //echo $obj->uuid();
    //var_dump($obj);
     
    echo ModelHelper::escapePage(5)."<br />";
    echo ModelHelper::escapePage(-1)."<br />";
    echo ModelHelper::escapePage("d'")."<br />";
    echo ModelHelper::uuid()."<br />";
    ?>

    转载from:http://www.hucde.com/2010/03/18/29

  • 相关阅读:
    XML 树操作 语法
    重构:第一个案例
    敏捷开发 慨叙
    sql server 字段类型
    Linux Win7双系统安装
    IE6/7不读取CSS样式,或不能正常显示背景图片问题
    eclipse 添加字体
    eclipse中测试Hibernate异常报 ORA00926: 缺失 VALUES 关键字
    关于简历的想法几点
    eclipse中测试Hibernate异常报'hibernate.dialect' must be set when no Connection avalable
  • 原文地址:https://www.cnblogs.com/hubing/p/3401903.html
Copyright © 2011-2022 走看看