ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ 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!
ΠΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ callback-ΡΡΠ½ΠΊΡΠΈΠΉ PHP.