liukuan.net

liukuan.net,发现,记录,分享

527

C语言的一个php类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
<code class='c'>
/*
  | 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 321634 2012-01-01 13:15:04Z felipe $ */
 
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
 
#include "php.h"
#include "php_ini.h"
#include "main/SAPI.h"
#include "ext/standard/info.h"
#include "php_iurl.h"
 
/* If you declare any globals in php_iurl.h uncomment this:
ZEND_DECLARE_MODULE_GLOBALS(iurl)
*/
 
ZEND_BEGIN_ARG_INFO_EX(void_arginfo, 0, 0, 0)
ZEND_END_ARG_INFO()
 
ZEND_BEGIN_ARG_INFO_EX(getBody_arginfo, 0, 0, 0)
	ZEND_ARG_INFO(0, bootstrap)
ZEND_END_ARG_INFO()
 
/* True global resources - no need for thread safety here */
static int le_iurl;
 
 
//ZEND_BEGIN_ARG_INFO_EX(void_arginfo, 0, 0, 0)
//ZEND_END_ARG_INFO()
 
/* {{{ iurl_functions[]
 *
 * Every user visible function must have an entry in iurl_functions[].
 */
const zend_function_entry iurl_functions[] = {
	PHP_FE(confirm_iurl_compiled,	NULL)		/* For testing, remove later. */
	PHP_FE_END	/* Must be the last line in iurl_functions[] */
};
/* }}} */
 
/* {{{ iurl_module_entry 
 */
 
zend_class_entry *iurl_class_ce;
 
zend_module_entry iurl_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
	STANDARD_MODULE_HEADER,
#endif
	"iurl",
	iurl_functions,
	PHP_MINIT(iurl),
	PHP_MSHUTDOWN(iurl),
	PHP_RINIT(iurl),		/* Replace with NULL if there's nothing to do at request start */
	PHP_RSHUTDOWN(iurl),	/* Replace with NULL if there's nothing to do at request end */
	PHP_MINFO(iurl),
#if ZEND_MODULE_API_NO >= 20010901
	"0.1", /* Replace with version number for your extension */
#endif
	STANDARD_MODULE_PROPERTIES
};
/* }}} */
 
#ifdef COMPILE_DL_IURL
ZEND_GET_MODULE(iurl)
#endif
 
/* {{{ PHP_INI
 */
/* Remove comments and fill if you need to have entries in php.ini
PHP_INI_BEGIN()
    STD_PHP_INI_ENTRY("iurl.global_value",      "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_iurl_globals, iurl_globals)
    STD_PHP_INI_ENTRY("iurl.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_iurl_globals, iurl_globals)
PHP_INI_END()
*/
/* }}} */
 
/* {{{ php_iurl_init_globals
 */
/* Uncomment this function if you have INI entries
static void php_iurl_init_globals(zend_iurl_globals *iurl_globals)
{
	iurl_globals->global_value = 0;
	iurl_globals->global_string = NULL;
}
*/
/* }}} */
/**
	ADDMETHOD是iurl定义的PHP_METHOD宏 其宏内容为#define ADDMETHOD(func) PHP_METHOD(iurl,func)
	ZEND_METHOD是"main/SAPI.h"下的一个宏,如果不包含此文件可以用PHP_METHOD替换
	下面在iurl里面定义一个__construct方法,该方法就是php class里面构造函数
	然后我们可以在该函数下,用c现实__construct的方法了
**/
ADDMETHOD(__construct){
 
}
 
/**
	ADDMETHOD是iurl定义的PHP_METHOD宏 其宏内容为#define ADDMETHOD(func) PHP_METHOD(iurl,func)
	ZEND_METHOD是"main/SAPI.h"下的一个宏,如果不包含此文件可以用PHP_METHOD替换
	在iurl里面定义一个getBody方法,该方法就是php class里面构造函数
	然后我们可以在该函数下,用c现实getBody的方法了
**/
 
ADDMETHOD(getBody){
	//定义一个zval变量
	zval *_body;
	//zend_parse_parameters 接受参数,
	if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &_body) == FAILURE){
		RETURN_FALSE;
	}
	RETURN_STRINGL(Z_STRVAL_P(_body), Z_STRLEN_P(_body), 1);
 
}
 
 
 
//这里是iurl方法列表,这个必须放到定义的所有方法下面
static zend_function_entry iurl_method[] = {
	ZEND_ME(iurl, __construct, void_arginfo, ZEND_ACC_CTOR|ZEND_ACC_PUBLIC)
	ZEND_ME(iurl,getBody, getBody_arginfo, ZEND_ACC_PUBLIC)
	{NULL,NULL,NULL}
};
 
 
/* {{{ PHP_MINIT_FUNCTION
 */
PHP_MINIT_FUNCTION(iurl)
{
	/* If you have INI entries, uncomment these lines 
	REGISTER_INI_ENTRIES();
	*/
	/*
	zend_class_entry 是类最基本的一个结构体
	zend_class_entry iurl_ce; 此句可认为是为iurl类申请一个存储地址
	*/
	zend_class_entry iurl_ce;
	/*
	INIT_CLASS_ENTRY 将iurl初始化
	下面将第一个参数iurl_ce(刚上面定义的一个类结构体)进行初始化操作,第二个参数定义了一个类名"iurl"(可以在php中使用new iurl()了),
	第三个参数类中的方法,上面我们定义了一个static zend_function_entry iurl_method[] 的结构,也就是引用到这里了。
	*/
	INIT_CLASS_ENTRY(iurl_ce, "iurl", iurl_method);
	/**
	初始化后iurl_ce 的注册
	参数是将上面步骤中初始化的iurl_ce进行进一步注册,到这里,它会
	返回一个指针地址,这个地址我们在很多方法中都要用到,所以我们在文件最顶定义了
	一个zend_class_entry *iurl_class_ce;的指针,目的是为了以后在全局都能使用它,
	所以把下面步骤中返回的地址给了一个全局指针变量iurl_class_ce我们以后再要用到它
	就直接用iurl_class_ce了
	**/
	iurl_class_ce = zend_register_internal_class(&iurl_ce TSRMLS_CC);
	/**
	下面定义了一个类中的成员变量
	第一个参数是我们上面定义的一个全局指针,其指向我们刚初始化iurl类的地址
	第二个参数为一个成员变量名,由关键词$this->指向的成员变量名
	第三个参数是成员变量的初始值
	第四个参数是方法的修饰关键词,ZEND_ACC_PUBLIC 就是类中public关键词,相当于这个成员变量可以任何人访问
	**/
	zend_declare_property_stringl(iurl_class_ce, ZEND_STRL("hellow"), ZEND_STRL("world12"), ZEND_ACC_PUBLIC TSRMLS_CC);
 
	return SUCCESS;
}
/* }}} */
 
/* {{{ PHP_MSHUTDOWN_FUNCTION
 */
PHP_MSHUTDOWN_FUNCTION(iurl)
{
	/* 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(iurl)
{
	return SUCCESS;
}
/* }}} */ 
 
/* Remove if there's nothing to do at request end */
/* {{{ PHP_RSHUTDOWN_FUNCTION
 */
PHP_RSHUTDOWN_FUNCTION(iurl)
{
	return SUCCESS;
}
/* }}} */ 
 
/* {{{ PHP_MINFO_FUNCTION
 */
PHP_MINFO_FUNCTION(iurl)
{
	//module info
	php_info_print_table_start();
	php_info_print_table_header(2, "iurl support", "enabled");
 
	php_info_print_table_row(2, "Version", "v1.0");
 
	php_info_print_table_end();
 
	/* Remove comments if you have entries in php.ini
	DISPLAY_INI_ENTRIES();
	*/
}
/* }}} */
 
 
/* Remove the following function when you have succesfully modified config.m4
   so that your module can be compiled into PHP, it exists only for testing
   purposes. */
 
/* Every user-visible function in PHP should document itself in the source */
/* {{{ proto string confirm_iurl_compiled(string arg)
   Return a string to confirm that the module is compiled in */
PHP_FUNCTION(confirm_iurl_compiled)
{
	char *arg = NULL;
	int arg_len, len;
	char *strg;
 
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
		return;
	}
 
	len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "iurl", arg);
	RETURN_STRINGL(strg, len, 0);
}
/* }}} */
/* The previous line is meant for vim and emacs, so it can correctly fold and 
   unfold functions in source code. See the corresponding marks just before 
   function definition, where the functions purpose is also documented. Please 
   follow this convention for the convenience of others editing your code.
*/
 
 
/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */
原文地址 : https://liukuan.net/note/86.html
本站遵循 : 知识共享署名-非商业性使用-相同方式共享 3.0 版权协议
版权声明 : 原创文章转载时,请务必以超链接形式标明 文章原始出处
作者:admin | 分类:学习笔记,个人原创,c/c++,php | 标签: php, C语言, 扩展
此文章共有条评论, 人参与 |Powerd By Angboo