PHP Conference Japan 2024

PHP 回呼

可以將 PHP Closure 指派給函式指標類型的原生變數,或將其作為函式引數傳遞

範例 #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 回呼的使用。

新增註記

使用者貢獻的註記

此頁面沒有使用者貢獻的註記。
To Top