PHP Conference Japan 2024

readline_callback_handler_install

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

readline_callback_handler_install初始化 readline 回呼介面和終端機,印出提示並立即返回

描述

readline_callback_handler_install(字串 $prompt, 可呼叫 $callback): true

設定 readline 回呼介面,然後印出 prompt 並立即返回。如果在未移除先前回呼介面的情況下再次呼叫此函式,將會自動且方便地覆蓋舊的介面。

回呼功能與 stream_select() 結合使用時非常有用,因為它允許 IO 和使用者輸入交錯進行,這與 readline() 不同。

參數

prompt

提示訊息。

callback

callback 函式接受一個參數:返回的使用者輸入。

返回值

永遠返回 true

範例

範例 #1 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)) {
// 讀取一個字元,輸入換行符號時將會呼叫回呼函式
readline_callback_read_char();
}
}

echo
"提示已停用。全部完成。\n";
?>

參見

新增筆記

使用者貢獻的筆記 1 則筆記

1
thflori
6 年前
要逐位元組讀取多行,您可以檢查 readline_info 中的 line_buffer

<?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); // 如果需要確切的位元組數,請使用 strlen
readline_callback_handler_remove();

return
$str;
}
To Top