CakeFest 2024: The Official CakePHP Conference

readline_callback_handler_install

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

readline_callback_handler_installInitialise l'interface et le terminal de rappel de readline, affiche le prompt et retourne immédiatement

Description

readline_callback_handler_install(string $prompt, callable $callback): bool

Définie une interface de rappel pour readline, affiche le prompt et retourne immédiatement. Appeler cette fonction deux fois sans effacer au préalable l'interface de rappel précédente effacera automatiquement et proprement l'ancienne interface.

La fonctionnalité de rappel est très utile lorsque combinée à la fonction stream_select() permettant l'interconnexion IO / entrée utilisateur, à la différence de readline().

Liste de paramètres

prompt

Le message de prompt.

callback

La fonction callback prend un paramètre : l'entrée utilisateur retournée.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple d'interface de rappel de Readline

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

echo
"You entered: $ret\n";
$c++;

if (
$c > 10) {
$prompting = false;
readline_callback_handler_remove();
} else {
readline_callback_handler_install("[$c] Entrer quelque chose : ", 'rl_callback');
}
}

$c = 1;
$prompting = true;

readline_callback_handler_install("[$c] Entrer quelque chose : ", 'rl_callback');

while (
$prompting) {
$w = NULL;
$e = NULL;
$n = stream_select($r = array(STDIN), $w, $e, null);
if (
$n && in_array(STDIN, $r)) {
// lit un caractère, appellera la fonction de callback lorsqu'une nouvelle ligne est entrée
readline_callback_read_char();
}
}

echo
"Le prompt est désactivé. Tout a été effectué.\n";
?>

Voir aussi

add a note

User Contributed Notes 1 note

up
1
thflori
5 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;
}
To Top