CodeZine(コードジン)

特集ページ一覧

配列などを使った実践的な関数を作成する

PHPエクステンションの作り方 第3回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2013/10/01 14:00
目次

リフレクション情報を設定する

 関数作成最後の仕上げとして、リフレクションなどを通じて引数情報が取得できるように設定を行います。この処理は実際の処理とは関係ありませんが、他の人に対して公開する場合などはぜひとも設定しておいた方がよい処理になります。

 例えば、以下のようなLong型の引数を2つ取る関数を作成をします。

引数を2つ取る場合(hellofunc.cより抜粋)
PHP_FUNCTION(hellofunc_args_num2){
  long val1 = 0, val2 = 0;
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &val1,&val2) == FAILURE ){
    return;
  }
  long sum = val1 + val2;
  RETURN_LONG(sum);
}

 この関数の引数情報を設定するには、以下のようになります。

関数の引数定義を作成する(hellofunc.cより抜粋)
ZEND_BEGIN_ARG_INFO_EX(arginfo_num2, 0, 0, 2)  // ……(1)
ZEND_ARG_INFO(0, long1)  // ……(2)
ZEND_ARG_INFO(0, long2)  // ……(3)
ZEND_END_ARG_INFO()      // ……(4)

 (1)のZEND_BEGIN_ARG_INFO_EXマクロは、以下の4つの引数を取ります。

  • 定義名(後で、PHP_FEで設定します)
  • 参照渡しを受け取るか
  • 戻り値を引数で受け取るか
  • 引数の数

 (2)(3)のZEND_ARG_INFOマクロは実際の引数を指定し、以下の2つの引数を取ります。

  • 参照渡しを受け取るかで、参照渡しの場合に1にする。
  • 引数の変数名(PHP_FEマクロで使用します)

 そして、(3)のZEND_END_ARG_INFOマクロで定義を閉じます。

関数に引数情報を設定する(hellofunc.cより抜粋)
const zend_function_entry hellofunc_functions[] = {
  :
  PHP_FE(hellofunc_args_num2,     arginfo_num2)  // ……(1)
  :
}

 最後に関数のエントリとして(1)PHP_FEマクロの第2引数に設定を行えば終了です。これらもPHPのソースを調べれば、たいていの場合は自分が作成したい関数の引数定義と同じような関数がすでにあります。分からない時には、それらのソースを参考にすると、ほとんどのケースでは問題ありません。

最後に

 前回と今回で一通りの関数の作成方法を紹介してきました。特に、今回紹介した配列は動的な扱いが簡単にできますので、使い方を覚えておくといろいろと応用ができます。

 また、ここでは紹介できませんでしたが、エクステンション側からは実際の引数はすべての型がzval型(PHPではMixed型)として扱うことが可能です。ここまで紹介してきた方法以外にも、実装方法も多数あります。実際に、それらについての詳細を知りたい場合には、PHPのソースを参照していくと良いでしょう。沢山の実装方法がありますので非常に勉強になり、新たな発見がそこからいくつも見つかるのではないかと思います。

参考資料



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:PHPエクステンションの作り方

著者プロフィール

  • WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。個人紹介主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしど...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5