SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

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

 例えば、以下のような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のソースを参照していくと良いでしょう。沢山の実装方法がありますので非常に勉強になり、新たな発見がそこからいくつも見つかるのではないかと思います。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
PHPエクステンションの作り方連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7385 2013/10/01 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング