Callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PHP

МоТно ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ PHP ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с Ρ‚ΠΈΠΏΠΎΠΌ Β«ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΒ» (pointer) ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Closure языка PHP ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ языка 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
"ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€ 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
"ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€ 2!\n";
$zend->zend_write = $orig_zend_write;
echo
"ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€ 3!\n";

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€ 1!
{
        ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€ 2!
}
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€ 3!
Π₯ΠΎΡ‚ΡŒ это ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ эта Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ поддСрТиваСтся Π½Π΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ libffi, Π½Π΅ эффСктивна ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ рСсурсов ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ запросов.
Подсказка

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ PHP.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ добавляли примСчания для страницы