PHP Conference Japan 2024

readline

(PHP 4, PHP 5, PHP 7, PHP 8)

readline讀取一行

說明

readline(?string $prompt = null): string|false

從使用者讀取單行輸入。您必須使用 readline_add_history() 手動將此行添加到歷史記錄中。

參數

prompt

您可以指定一個字串來提示使用者。

回傳值

從使用者返回一個字串。傳回的行已移除結尾的換行符號。如果沒有更多資料可供讀取,則傳回 false

範例

範例 #1 readline() 範例

<?php
//從使用者取得 3 個指令
for ($i=0; $i < 3; $i++) {
$line = readline("指令: ");
readline_add_history($line);
}

//傾印歷史紀錄
print_r(readline_list_history());

//傾印變數
print_r(readline_info());
?>

新增註記

使用者貢獻的註記 5 則註記

Antony Penn
4 年前
Christian 的程式碼運作良好,但如果您希望能夠隱藏使用者輸入並且不將其顯示在螢幕上,您需要在 read 指令中新增 -s。以下程式碼是一個擴充函式,允許選擇性提示和選擇性隱藏輸入

function read_password($prompt=null, $hide=false)
{
if($prompt) print $prompt;
$s = ($hide) ? '-s' : '';
$f=popen("read $s; echo \$REPLY","r");
$input=fgets($f,100);
pclose($f);
if($hide) print "\n";
return $input;
}
turdsurfer
7 年前
如果您的 CLI 指令碼接受來自 STDIN 的輸入,並且您也希望它提示輸入密碼(例如 mysql 用戶端的功能),則 readline() 將無法運作。
您需要做的是從終端裝置讀取,如下所示。

function readline_terminal($prompt = '') {
$prompt && print $prompt;
$terminal_device = '/dev/tty';
$h = fopen($terminal_device, 'r');
if ($h === false) {
#throw new RuntimeException("無法開啟終端裝置 $terminal_device");
return false; # 可能沒有在終端機中執行。
}
$line = rtrim(fgets($h),"\r\n");
fclose($h);
return $line;
}
$pass = readline_terminal('密碼: ');
cox at idecnet dot com
22 年前
在 CGI 模式下,請務必呼叫

ob_implicit_flush(true);

在指令碼的頂部,如果您希望能夠在提示之前和之後輸出資料。

-- Tomas V.V.Cox
匿名
7 年前
一些觀察…

我使用 Cygwin PHP v7 且 readline 可用。 然而 readline_list_history() 函式未定義。

包含跳脫序列的提示會被清除,因此請使用類似以下的內容

<?php
echo("\e[0m\e[34mPromt>\e[0m");
$inp = readline(' ');
?>

我尚未完整記錄,但我發現有時候以標點符號開頭的字串無法使用 readline_add_history() 加入歷史紀錄。它們有時還會清除提示字串。
rojaro at gmail dot com
16 年前
請注意,當使用者按下 CTRL+D 時,readline() 會回傳布林值「false」。
To Top