【PHP8.x】readline関数の使い方

readline関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

readline関数は、PHPのコマンドラインインターフェース(CLI)環境において、ユーザーからのテキスト入力を受け付けるために使用される関数です。この関数は、プログラムが実行中にユーザーに対して何らかの情報を求め、その応答を読み取る際に非常に役立ちます。

具体的には、任意で指定できるプロンプト文字列を引数として渡すことで、ユーザーに対して「名前を入力してください: 」や「はい/いいえで答えてください: 」といったメッセージを表示し、ユーザーがキーボードから入力し、Enterキーを押すまでの内容を読み取ります。引数を省略した場合、プロンプトは表示されずに直接入力待機状態となります。

readline関数は、ユーザーが入力した文字列をそのまま返り値として返します。これにより、プログラムはユーザーの入力内容に基づいて次の処理に進むことができます。例えば、簡単な対話型スクリプトや、設定ファイルを生成するためのウィザード、CLIベースの簡単なゲームなど、ユーザーとの相互作用が必要な場面で活用されます。

ただし、この関数は主にWebサーバー上で動作するPHPアプリケーションではなく、ターミナルやコマンドプロンプトから直接実行されるPHPスクリプト(CLI版PHP)での利用を想定しています。入力中にエラーが発生した場合や、入力が途中で終了した場合はfalseを返すことがありますので、戻り値の確認が重要です。

構文(syntax)

1<?php
2
3$input_string = readline("プロンプト文字列: ");

引数(parameters)

?string $prompt = null

  • ?string $prompt: ユーザーに入力を促すためのメッセージ文字列。省略された場合は何も表示されません。

戻り値(return)

string|false

ユーザーからの入力を一行の文字列として返します。入力がなかった場合は false を返します。

サンプルコード

PHP readline 履歴をファイルから読み込む

1<?php
2
3/**
4 * readline拡張の履歴機能を使い、ファイルから履歴を読み込むサンプルコードです。
5 *
6 * readline() 関数自体は標準入力からユーザー入力を受け付けますが、
7 * readline_read_history() 関数を使用すると、以前の入力履歴をファイルから読み込み、
8 * その後の readline() 関数での入力時に上下矢印キーで履歴を辿れるようにすることができます。
9 *
10 * このコードを実行するには、PHP CLI環境と readline 拡張が有効になっている必要があります。
11 *
12 * 実行例: php your_script_name.php
13 * その後、プロンプトが表示されたら何か入力してみてください。
14 * 上下矢印キーで履歴が表示されることを確認できます。
15 */
16function demonstrateReadlineHistoryFromFile(): void
17{
18    // readline拡張が有効でない場合は処理を終了
19    if (!extension_loaded('readline')) {
20        echo "エラー: 'readline' 拡張が有効ではありません。PHP設定を確認してください。" . PHP_EOL;
21        return;
22    }
23
24    // 履歴ファイル名を定義
25    // スクリプトと同じディレクトリにファイルを作成します。
26    $historyFile = __DIR__ . '/.my_readline_history';
27
28    echo "--- readline履歴ファイルの操作デモンストレーション ---" . PHP_EOL;
29
30    // 1. 履歴ファイルが存在しない場合は作成し、初期履歴を追加
31    if (!file_exists($historyFile)) {
32        echo "履歴ファイル '{$historyFile}' が見つかりません。新規作成し、初期履歴を書き込みます。" . PHP_EOL;
33        // いくつかのコマンドを履歴に追加
34        readline_add_history('echo "Hello from history!"');
35        readline_add_history('ls -l');
36        readline_add_history('php -v');
37        readline_add_history('my custom command');
38        
39        // 現在の履歴をファイルに保存
40        readline_write_history($historyFile);
41        echo "初期履歴をファイルに書き込みました。" . PHP_EOL;
42    } else {
43        echo "既存の履歴ファイル '{$historyFile}' を使用します。" . PHP_EOL;
44    }
45
46    // 2. 現在のセッションの履歴をクリア
47    // これにより、ファイルから読み込む履歴が明確になります。
48    readline_clear_history();
49    echo "現在のセッションの履歴をクリアしました。" . PHP_EOL;
50    echo "現在の履歴リスト: " . implode(', ', readline_list_history() ?: ['(なし)']) . PHP_EOL;
51
52    // 3. ファイルから履歴を読み込む
53    echo "ファイル '{$historyFile}' から履歴を読み込みます..." . PHP_EOL;
54    if (readline_read_history($historyFile)) {
55        echo "履歴をファイルから正常に読み込みました。" . PHP_EOL;
56        echo "読み込まれた履歴リスト: " . implode(', ', readline_list_history() ?: ['(なし)']) . PHP_EOL;
57    } else {
58        echo "履歴をファイルから読み込めませんでした。ファイルが存在しないか、アクセス権がありません。" . PHP_EOL;
59        return;
60    }
61
62    echo PHP_EOL;
63    echo "--- readline() 関数による対話型入力 ---" . PHP_EOL;
64    echo "プロンプトが表示されたら何か入力してください。" . PHP_EOL;
65    echo "上下矢印キーで、上記ファイルから読み込まれた履歴を辿れることを確認してください。" . PHP_EOL;
66
67    // 4. readline() 関数を使ってユーザー入力を受け付ける
68    // この時点で、上記ファイルから読み込まれた履歴が利用可能です。
69    $input = readline("入力してください > ");
70
71    if ($input === false) {
72        echo "入力がキャンセルされました。" . PHP_EOL;
73    } else {
74        echo "あなたの入力: " . $input . PHP_EOL;
75        // 新しい入力を履歴に追加
76        readline_add_history($input);
77        // 更新された履歴を再度ファイルに書き込むこともできます
78        readline_write_history($historyFile);
79        echo "新しい入力が履歴に追加され、ファイルに保存されました。" . PHP_EOL;
80    }
81
82    echo PHP_EOL;
83    echo "--- 処理終了 ---" . PHP_EOL;
84    echo "最終的な履歴リスト: " . implode(', ', readline_list_history() ?: ['(なし)']) . PHP_EOL;
85    // 必要であれば、作成された履歴ファイルを削除してクリーンアップすることも可能です。
86    // unlink($historyFile);
87}
88
89// 関数を実行します。
90demonstrateReadlineHistoryFromFile();

readline関数は、主にコマンドライン(CLI)環境で、ユーザーからの入力を一行受け取るために使用される関数です。

引数 $prompt には、入力待ちの際に表示するプロンプト文字列(例: "入力してください > ")を指定します。この引数は省略可能で、指定しない場合はプロンプトは表示されません。関数が実行されると、ユーザーが文字列を入力してEnterキーを押すまでプログラムは待機します。

戻り値として、ユーザーが入力した文字列が返されます。もしユーザーが何も入力せずに処理を中断した場合(Unix系の環境でCtrl+Dを押すなど)や、何らかのエラーが発生した場合は false が返されます。

このサンプルコードでは、readline関数そのものに加え、その履歴機能に焦点を当てています。readline_read_history()関数を使用すると、ファイルに保存されている過去の入力履歴を読み込むことができます。これにより、プログラムの実行時に上下矢印キーを押すことで、以前入力した内容を簡単に再利用できるようになります。同様に、readline_add_history()readline_write_history()関数で、現在のセッションで入力された内容を履歴としてファイルに保存し、次回の実行に備えることも可能です。

このコードはWebブラウザ上ではなく、コマンドラインから php コマンドで実行する必要があります。また、PHPの readline 拡張モジュールがインストールされ、有効になっていることが必須です。環境によっては別途インストールが必要になる場合があります。履歴を保存するファイルには、スクリプトを実行するユーザーからの読み書き権限が必要です。権限がないと履歴の保存や読み込みに失敗する可能性があります。ユーザーが入力せずにCtrl+D(ファイルの終端)を押した場合、readline関数はfalseを返すため、戻り値の厳密な型チェックが重要です。readline_read_history関数は、メモリ上の既存の履歴にファイルの内容を追加するため、意図しない履歴が混ざらないよう注意が必要です。

PHP readlineでユーザー名を取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * コマンドラインからユーザーの入力を受け取り、挨拶を表示します。
7 */
8function greetUser(): void
9{
10    // プロンプトを表示し、ユーザーの入力を1行読み取ります。
11    // readline() は、ユーザーが入力した文字列を返すか、
12    // 入力がない場合 (例: Ctrl+D) は false を返します。
13    $name = readline("あなたのお名前を入力してください: ");
14
15    // 入力が有効かどうかを検証します。
16    if ($name === false || $name === '') {
17        echo "入力がキャンセルされたか、空でした。\n";
18        return;
19    }
20
21    // 入力された名前を使って挨拶します。
22    echo "こんにちは、" . $name . "さん!\n";
23}
24
25// 関数を実行します。
26greetUser();

このPHPサンプルコードは、コマンドライン上でユーザーと対話するためのreadline関数の使い方を示しています。readline関数は、実行中のプログラムを一時停止し、ユーザーがキーボードから文字列を1行入力してEnterキーを押すまで待機します。

この関数は、引数としてユーザーに入力を促すメッセージ(プロンプト)を文字列で指定できます。サンプルコードでは"あなたのお名前を入力してください: "というプロンプトを渡しており、実行するとこのメッセージが画面に表示されます。この引数は省略することも可能です。

関数の戻り値は、ユーザーが入力した文字列そのものです。しかし、ユーザーが何も入力せずに終了操作(例えばCtrl+Dキーを押すなど)を行った場合は、文字列ではなくfalseという特別な値が返されます。

サンプルコードでは、readline関数で受け取った値を$nameという変数に代入しています。その後、if文を使って$nameの値がfalseや空文字列でないことを確認しています。このチェックによって、予期せぬ入力があった場合でもプログラムがエラーを起こさず、適切なメッセージを表示して終了できます。有効な名前が入力された場合にのみ、その名前を含んだ挨拶のメッセージが出力されます。

このコードはWebブラウザ上ではなく、ターミナルなどのコマンドライン環境で実行する必要があります。readline関数は、ユーザーが入力した文字列を返しますが、入力をキャンセル(Ctrl+Dなど)した場合はfalseを返します。そのため、戻り値がfalseである可能性を必ず考慮し、サンプルコードのように厳密な比較演算子===を使って判定することが重要です。このチェックを怠ると、予期せぬエラーの原因となります。また、環境によってはphp-readline拡張モジュールが別途必要になる場合があり、未導入だと関数が使えない点にも注意が必要です。

関連コンテンツ