Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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
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拡張モジュールが別途必要になる場合があり、未導入だと関数が使えない点にも注意が必要です。

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
3/**
4 * readline関数を使用してユーザーからパスワード入力を受け取るサンプルコードです。
5 *
6 * 注意: readline関数は入力された文字を画面にエコーバックするため、
7 * 実際のパスワード入力には推奨されません。
8 * セキュリティが要求されるパスワード入力には、入力文字を非表示にする
9 * 別の方法(例: `stty -echo`と`fgets(STDIN)`の組み合わせなど)を検討してください。
10 *
11 * @return string|false ユーザーが入力したパスワード文字列、または入力読み取り失敗時にfalse
12 */
13function getUserPasswordUsingReadline(): string|false
14{
15    // readline関数を使ってプロンプトを表示し、ユーザーからの入力を受け取ります。
16    // 入力された文字列は画面にそのまま表示(エコー)されます。
17    $password = readline('パスワードを入力してください: ');
18
19    // readlineはエラー時やEOF(End-Of-File)時にfalseを返す可能性があるため、
20    // その場合の処理を考慮します。
21    if ($password === false) {
22        echo "入力の読み取り中にエラーが発生しました。\n";
23        return false;
24    }
25
26    return $password;
27}
28
29// 関数を実行し、ユーザーからの入力を取得します。
30$enteredPassword = getUserPasswordUsingReadline();
31
32// 取得したパスワードを表示します。
33if ($enteredPassword !== false) {
34    echo "入力されたパスワード: " . $enteredPassword . "\n";
35    // 通常はここで、入力されたパスワードの検証などの処理を行います。
36}
37
38?>

PHPのreadline関数は、コマンドラインインターフェース(CUI)上でユーザーから一行のテキスト入力を受け取るために使用される関数です。システムエンジニアにとって、ユーザーとの対話型プログラムを作成する際に役立ちます。

この関数には、ユーザーに入力を促すためのプロンプト文字列を引数として渡すことができます。例えば「パスワードを入力してください: 」のように指定することで、ユーザーは何を入力すべきか理解できます。このプロンプトは省略可能です。

readline関数は、ユーザーが入力してEnterキーを押した文字列を戻り値として返します。もし入力の読み取りに失敗した場合や、ユーザーが入力せずに終了(例: Ctrl+D)した場合などにはfalseが返される可能性があります。そのため、戻り値がfalseでないかを確認する処理が重要です。

提供されたサンプルコードでは、このreadline関数を利用して、ユーザーにパスワードの入力を促し、その値を受け取っています。しかし、readline関数は入力された文字を画面にそのまま表示(エコーバック)してしまうため、パスワードのような機密性の高い情報の入力には適していません。実際のシステムでセキュリティが要求されるパスワード入力を行う際は、入力文字を非表示にする別の手法を検討する必要があります。この関数は、一般的なコマンドラインでの情報入力に適しています。

このサンプルコードは、PHPのreadline関数による基本的なユーザー入力を示しています。しかし、readline関数は入力された文字を画面にそのまま表示(エコーバック)してしまうため、パスワードのような機密情報の入力には絶対に使用しないでください。セキュリティが求められるパスワード入力では、入力文字が画面に表示されない、別の専用の入力方法を必ず採用することが重要です。また、readline関数は入力の読み取りに失敗した場合にfalseを返すことがありますので、プログラムでその戻り値を常に確認し、適切なエラー処理を行うように注意してください。

PHP readlineでユーザー入力を取得する

1<?php
2
3/**
4 * readline関数を利用して、コマンドラインからユーザー入力を受け取るサンプルスクリプトです。
5 *
6 * このスクリプトを実行するには、PHPに 'readline' 拡張機能がインストールされている必要があります。
7 * インストールされていない場合は、その旨を通知し、一般的なインストール方法の例を提示します。
8 */
9
10// readline拡張がPHPにロードされているかを確認します。
11// readline関数は、この拡張機能が有効な場合にのみ使用できます。
12if (!extension_loaded('readline')) {
13    echo "エラー: 'readline' 拡張機能がインストールされていません。\n";
14    echo "このスクリプトを実行するには、PHPに 'readline' 拡張機能をインストールしてください。\n\n";
15    echo "インストール例:\n";
16    echo "  - Debian/Ubuntu系の場合: sudo apt install php8.x-readline (8.xはPHPのバージョン例)\n";
17    echo "  - macOS (Homebrew)の場合: brew install php && pecl install readline\n"; // PHPがHomebrewでインストール済みの場合
18    exit(1); // エラーコードでスクリプトを終了
19}
20
21// readline関数を使ってユーザーにプロンプト(質問)を表示し、入力を受け取ります。
22// プロンプト文字列は引数として渡します。
23$userName = readline("あなたの名前を入力してください: ");
24
25// readline関数は、ユーザーがCtrl+D(EOF)などで入力を中断した場合にfalseを返します。
26if ($userName === false) {
27    echo "入力が中断されました。\n";
28} elseif (trim($userName) === '') {
29    // 入力が空文字列または空白のみだった場合の処理
30    echo "名前が入力されませんでした。\n";
31} else {
32    // 有効な入力があった場合、受け取った名前を表示します。
33    echo "こんにちは、" . $userName . "さん!\n";
34}
35
36// 必要に応じて、readline_add_history() で入力履歴を追加したり、
37// readline_clear_history() で履歴をクリアすることもできますが、
38// この基本的な例では省略します。
39
40?>

PHPのreadline関数は、コマンドラインインターフェース(CLI)アプリケーションにおいて、ユーザーからの入力を受け取るために使用されます。

この関数を利用するには、PHPにreadline拡張機能がインストールされている必要があります。サンプルコードでは、まずextension_loaded('readline')という関数で拡張機能の有無を確認し、インストールされていない場合はその旨を通知し、Debian/UbuntuやmacOSでの一般的なインストール方法の例を提示しています。これは、readline関数を使用する上での重要な初期設定です。

readline()関数は、引数として渡された文字列($prompt)をユーザーに「質問」として表示し、ユーザーが入力してEnterキーを押すまでプログラムの実行を待機します。

ユーザーが入力した文字列は、この関数の戻り値として返されます(string型)。しかし、もしユーザーがCtrl+Dキーを押すなどして入力処理を中断した場合、この関数は戻り値としてfalseを返します。サンプルコードでは、このfalseが返された場合や、ユーザーが何も入力せずにEnterキーを押した場合(または空白のみを入力した場合)の処理も考慮されており、状況に応じたメッセージを表示するように設計されています。

このようにreadline関数を活用することで、ユーザーと対話形式で情報をやり取りするPHPスクリプトを簡単に作成することができます。

このサンプルコードの最も重要な注意点は、readline関数がPHPのreadline拡張機能に依存していることです。スクリプト実行前に、この拡張機能がシステムにインストールされ、PHPにロードされていることを必ず確認してください。関数はユーザーがCtrl+Dなどで入力を中断した場合にfalseを返すため、戻り値がfalseでないかを必ずチェックし、適切なエラー処理を実装する必要があります。また、ユーザーが何も入力せずにEnterを押したり、空白のみを入力するケースも考慮し、trim関数などを用いて入力内容を適切に検証してください。この関数は、コマンドラインツールで対話的にユーザー入力を受け取る際に非常に有効です。

関連コンテンツ

関連IT用語