我们在开发过程中,为了代码得可读性和易维护性,肯定是须要多个代码文件的,而不不过通过 ext_skel 生成得骨架文件。
这篇文章主要介绍下。多个代码文件的时候。我们须要注意什么,以及怎么做。
我的代码文件例如以下(slash为我的扩展名)
// ext_skel 生成默认得模块相关的主要文件
php_slash.h // 头文件
slash.c // 源代码文件
config.m4 // 编译的时候须要改动的文件
在这个默认生成的骨架文件中面,我们只要运行以下几步,就能够完毕一个新的扩展了。
删除config.m4的第10-12行开头的凝视dnl
phpize
./configure
make && make install
通过上面的步骤,我们就完毕了一个扩展,通过 dl(“slash.so”);的方式就能够进行測试了。假设编写一个类在上一篇文章里有介绍。
以下我们介绍添加新的类和源代码文件以及怎样编译配置等。
添加一个新的php类(Slash_Http_Util),而且给该类添加一个 getIv 的方法,php代码測试代码例如以下:
$httpUtil = new Slash_Http_Util();
$httpUtil->getIv(); // 会输出 HELLO
源代码文件 slash_http_util.h
#ifndef SLASH_HTTP_UTIL_H
#define SLASH_HTTP_UTIL_H
extern zend_class_entry *slash_http_util_ce;
PHP_METHOD(slash_http_util, getIv);
SLASH_MINIT_FUNCTION(http_util);
#endif
源代码文件 slash_http_util.c
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h" /* for zend_alter_ini_entry */
#include "php_slash.h"
#include "slash_http_util.h"
zend_class_entry *slash_http_util_ce;
PHP_METHOD(slash_http_util, getIv) {
php_printf("HELLO");
RETURN_TRUE;
}
zend_function_entry slash_http_util_methods[] = {
ZEND_ME(slash_http_util, getIv, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
PHP_FE_END
};
SLASH_MINIT_FUNCTION(http_util) {
zend_class_entry ce;
SLASH_INIT_CLASS_ENTRY(ce, SLASH_CN_HTTP_UTIL, slash_http_util_methods);
slash_http_util_ce = zend_register_internal_class(&ce TSRMLS_CC);
return SUCCESS;
}
以上的代码完毕了新类的加入。而且给该类添加了一个叫 getIv 的方法。
以下须要改动我的 config.m4 配置文件,添加 slash_http_util.c 这个文件。
打开 config.m4 到最后倒数第二行。默认 ext_skel 生成的代码是
PHP_NEW_EXTENSION(slash,slash.c,$ext_shared)
改动,添加 slash_http_util.c 这个文件,须要注意的是两个 *.c 文件之间是空格,没有标点符号
PHP_NEW_EXTENSION(slash,slash.c slash_http_util.c, $ext_shared)
完毕 config.m4 的改动以后,还须要去改动 slash.c 这个文件,默认情况下在这个文件中会有以下的代码
PHP_MINIT_FUNCTION(slash)
{
/* If you have INI entries, uncomment these lines
REGISTER_INI_ENTRIES();
*/
return SUCCESS;
}
我们须要把我们新创建的这个类载入进来
PHP_MINIT_FUNCTION(slash)
{
/* If you have INI entries, uncomment these lines
REGISTER_INI_ENTRIES();
*/
SLASH_STARTUP(http_util);
return SUCCESS;
}
通过这几步,新的类就全然创建成功了,你能够通过 phpize、configure、make 来编译这个模块了。最后通过我们開始制定的目标进行測试。
几个须要注意的问题:
1. 改动 config.m4 文件,添加源代码文件
2. 改动 config.m4 文件以后。须要又一次运行 phpize && ./configure && make
3. 在模块(slash.c文件)载入函数中 PHP_MINIT_FUNCTION 加入这个新的类。
上面的代码中假设你全然copy可能没办法通过编译,由于我自己定义重命名了几个宏(php_slash.h)。实际开发中你能够zend的宏。
#define SLASH_CN_HTTP_UTIL "Slash_Http_Util"
// {{{ php life cycle redefine
#define SLASH_MINIT_FUNCTION(module) PHP_MINIT_FUNCTION(slash_##module)
#define SLASH_MSHUTDOWN_FUNCTION(module) PHP_MSHUTDOWN_FUNCTION(slash_##module)
#define SLASH_RINIT_FUNCTION(module) PHP_RINIT_FUNCTION(slash_##module)
#define SLASH_RSHUTDOWN_FUNCTION(module) PHP_RSHUTDOWN_FUNCTION(slash_##module)
#define SLASH_STARTUP(module) PHP_MODULE_STARTUP_N(slash_##module)(INIT_FUNC_ARGS_PASSTHRU)
// }}}
// {{{ class init mac
#define SLASH_INIT_CLASS_ENTRY(ce, name, methods) INIT_CLASS_ENTRY(ce, name, methods)
// }}}
以上代码仅供參考,欢迎交流。