2011年10月29日土曜日

php extensionを作成する ~クラスの書き方~

この記事を読むと・・・、

$obj = new Mypcap();
echo $obj->interface();
echo $obj->filter();


$pkt = $obj->get_packet();

echo $pkt->srcip
echo $pkt->dstip
echo $pkt->protocol
echo $pkt->sport
echo $pkt->dport
echo $pkt->http_request


見たいなコードを書けるようになる。


PHP拡張でクラス実装がよくわからん

DSAS開発者の部屋 PHPextension 第3回

※ helloworldくらいは作っておく。


1,クラスの作成

① php_mypcap.h に追記
static zend_class_entry *mypcap_ce;

② mypcap.c の PHP_MINIT_FUNCTION(mypcap) に追記
zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "Mypcap", mypcap_functions);
mypcap_ce = zend_register_internal_class(&ce TSRMLS_CC);

zend_declare_property_string(mypcap_ce, "interface", strlen("interface"), "eth2", ZEND_ACC_PUBLIC)

zend_declare_property_string(mypcap_ce, "filter", strlen("filter"), "tcp", ZEND_ACC_PUBLIC)


return SUCCESS;

これでクラスのインスタンスを生成できるようになる。
このクラスには、interfaceとfilterというプロパティ(メンバ変数)がある。


2,メソッドの作成

① php_mypcap.h にメッソド名を宣言
PHP_METHOD(mypcap, get_packet);

② mypcap.c の mypcap_functions にメッソド名を追記する。
PHP_ME(mypcap, get_packet, NULL, 0);


③ mypcap.c の最後の方に関数を実装する。
PHP_METHOD(mypcap , get_packet){
  printf("get");
  return
}

※1 メソッド内で、メンバ変数を読み込む方法。
zval *interf;
obj = getThis();
interf = zend_read_property(Z_OBJCE_P(obj),obj, "interface",strlen("interface"), 1 TSRMLS_CC);
printf("%s\n", interf->value.str.val);


※2 メソッド内で、引数を取得する方法。
char *arg;
int arg_len;
if(zend_parse_parameters(ZEND_NUMARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE)
{return;}
printf("%s\n",arg);


※3 メソッドで、インスタンスを返り値とする方法。
zval *pkt;

// オブジェクト生成
MAKE_STD_ZVAL(pkt);
if(object_init(pkt) != SUCCESS){}
add_property_stringl(pkt, "srcip","",strlen(""),1);
add_property_stringl(pkt, "dstip","",strlen(""),1);
add_property_stringl(pkt, "protocol","",strlen(""),1);
add_property_longl(pkt, "sport",0);
add_property_longl(pkt, "dport",0);
add_property_stringl(pkt, "http_requ","",strlen(""),1);

// オブジェクト返却
*return_value = *pkt;
zval_copy_ctor(return_value);

return;

PHP: Zend API: PHPのコアをハックする。
ここを参考にした。

PHPエクステンションから戻り値を~
ここも参考にした。

0 件のコメント:

コメントを投稿