学习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源代码 ext\ext_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-width: 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

转载于:https://www.cnblogs.com/daiye/archive/2011/05/13/2045150.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值