readline_callback_handler_install

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

readline_callback_handler_install β€” Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ callback-интСрфСйс readline ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ строку ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅

ОписаниС

function readline_callback_handler_install(string $prompt, callable $callback): true

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ callback-интСрфСйс readline, ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ prompt ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ удалСния старого callback-интСрфСйса ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ автоматичСской Π΅Π³ΠΎ пСрСзаписи.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ особСнно ΡƒΠ΄ΠΎΠ±Π΅Π½ Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с stream_select(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ readline(), позволяСт Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

prompt
Π‘Ρ‚Ρ€ΠΎΠΊΠ° ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ.
callback
Ѐункция пСрСдаваСмая Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ callback Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true.

Бписок измСнСний

ВСрсия ОписаниС
8.5.0 ВмСсто ΠΎΠ±Ρ‰Π΅Π³ΠΎ логичСского Ρ‚ΠΈΠΏΠ° bool Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ возвращаСтся ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ true.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования callback-интСрфСйса readline

<?php
function rl_callback($ret)
{
global
$c, $prompting;

echo
"Π’Ρ‹ Π²Π²Π΅Π»ΠΈ: $ret\n";
$c++;

if (
$c > 10) {
$prompting = false;
readline_callback_handler_remove();
} else {
readline_callback_handler_install("[$c] ΠŸΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ со ΠΌΠ½ΠΎΠΉ: ", 'rl_callback');
}
}

$c = 1;
$prompting = true;

readline_callback_handler_install("[$c] Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ: ", 'rl_callback');

while (
$prompting) {
$w = NULL;
$e = NULL;
$n = stream_select($r = array(STDIN), $w, $e, null);
if (
$n && in_array(STDIN, $r)) {
// Ρ‡ΠΈΡ‚Π°Π΅ΠΌ символ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ,
// Ссли Π²Π²Π΅Π΄Ρ‘Π½ символ Π½ΠΎΠ²ΠΎΠΉ строки
readline_callback_read_char();
}
}

echo
"Π’Π²ΠΎΠ΄ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½. Бпасибо Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.\n";
?>

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

  • readline_callback_handler_remove() - УдаляСт Ρ€Π°Π½Π΅Π΅ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ восстанавливаСт Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»
  • readline_callback_read_char() - Π§ΠΈΡ‚Π°Π΅Ρ‚ символ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ readline, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° строка
  • stream_select() - ЗапускаСт эквивалСнт систСмного Π²Ρ‹Π·ΠΎΠ²Π° select() Π½Π° массивах ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ оТидания Π² сСкундах ΠΈ микросСкундах
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

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

up
1
thflori ΒΆ
7 years ago
To read byte wise and multi line you can check the line_buffer from readline_info:

<?php

function read(int $count, string $prompt = null): string
{
    $previous = '';
    readline_callback_handler_install($prompt ?? " \e[D", function ($str) use (&$previous) {
        $previous .= $str . PHP_EOL;
    });
    do {
        $r = array(STDIN);
        $n = stream_select($r, $w, $e, null);
        if ($n && in_array(STDIN, $r)) {
            readline_callback_read_char();
            $str = $previous . readline_info('line_buffer');
        }
    } while (mb_strlen($str) < $count); // use strlen if you need the exact byte count
    readline_callback_handler_remove();

    return $str;
}