« FFI の基本的な使い方
PHP/FFI/事前ロードの完全な例 »

PHP のコールバック

PHP のクロージャを、関数ポインタ型のネイティブ変数に代入したり、 関数の引数として渡したりできます。

例1 PHP の Closure を C の関数ポインタに代入する

<?php
$zend = FFI::cdef("
    typedef int (*zend_write_func_t)(const char *str, size_t str_length);
    extern zend_write_func_t zend_write;
");

echo "Hello World 1!\n";

$orig_zend_write = clone $zend->zend_write;
$zend->zend_write = function($str, $len) {
    global $orig_zend_write;
    $orig_zend_write("{\n\t", 3);
    $ret = $orig_zend_write($str, $len);
    $orig_zend_write("}\n", 2);
    return $ret;
};
echo "Hello World 2!\n";
$zend->zend_write = $orig_zend_write;
echo "Hello World 3!\n";
?>

上の例の出力は以下となります。

Hello World 1!
{
        Hello World 2!
}
Hello World 3!
これは動作こそしますが、この機能は libffi が動作するすべてのプラットフォームでサポートされているわけではありません。 また、非効率的であり、リクエストの終了時にリソースがリークします。
ヒント

したがって、PHP のコールバックの使用は最小限にすることを推奨します。

関連キーワード:
zend   write   Hello   World   orig   バック   ポインタ   代入   func   基本的   使い方   ロード   クロージャ   ネイティブ   変数   Closure   cdef   typedef   size   length   extern   clone   return   libffi   プラットフォーム
関連する関数・ページ:
function.zend-version   v8js.examples   function.zend-thread-id   phar.requirements   info.configuration   function.dio-write