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

【PHP8.x】STDIN定数の使い方

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

作成日: 更新日:

基本的な使い方

STDIN定数は、PHPにおける標準入力ストリームを表す定数です。これは、プログラムが外部からデータを受け取るための主要な経路を指します。具体的には、コマンドラインからスクリプトを実行した際に、ユーザーがキーボードで入力したデータや、パイプ(|)を使って別のプログラムから送られてくるデータなどを読み込むために使用されます。

STDIN定数は、PHPの内部でファイルポインタ(リソース)として扱われ、通常のファイルと同様にfread()fgets()といったファイル操作関数を用いてその内容を読み取ることができます。これにより、PHPスクリプトはユーザーとの対話的な処理や、他のプログラムからのデータ入力処理を容易に実装できます。例えば、ユーザーに名前の入力を促し、その入力を受け取って処理するようなシナリオで役立ちます。

この定数は、特にコマンドラインインターフェース(CLI)で動作するPHPスクリプトにおいて非常に重要です。プログラムの入力源として機能するSTDINの他に、処理結果を出力するSTDOUT(標準出力)や、エラーメッセージを出力するSTDERR(標準エラー出力)といった定数も存在し、これらはまとめて標準I/O(入出力)と呼ばれます。STDIN定数は、外部からの情報を効率的に取得するための基本的な仕組みを提供する、PHPの強力な機能の一つです。

構文(syntax)

1<?php
2echo "何か入力してください: ";
3$input = fgets(STDIN);
4echo "入力された内容: " . $input;
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

resource

PHP_INPUTという定数で定義されており、標準入力ストリームを表すリソースを返します。

サンプルコード

PHP STDINから一行読み取る

1<?php
2
3/**
4 * 標準入力(STDIN)から一行を読み込み、表示するサンプルコードです。
5 * STDINは、プログラムが外部からデータを受け取るための標準的な入り口(ストリーム)を表す定数です。
6 * コマンドラインでこのスクリプトを実行すると、ユーザーがキーボードから入力した内容を読み取ります。
7 */
8function readLineFromStdin(): void
9{
10    echo "何か入力してください(入力後Enterキーを押してください): ";
11
12    // STDINはPHPの組み込み定数で、標準入力ストリームを指します。
13    // fgets()関数は、このストリームから一行を読み取ります。
14    $inputLine = fgets(STDIN);
15
16    // 入力に失敗した場合(例: ストリームが閉じているなど)のチェック
17    if ($inputLine === false) {
18        echo "標準入力からの読み込みに失敗しました。\n";
19        return;
20    }
21
22    // fgets()は改行文字(\n)も含むため、trim()で削除して整形します。
23    $trimmedInput = trim($inputLine);
24
25    echo "入力された内容: '" . $trimmedInput . "'\n";
26}
27
28// 関数を実行して、STDINからの読み込み処理をデモンストレーションします。
29readLineFromStdin();

PHPのSTDINは、プログラムが外部からデータを受け取るための「標準入力ストリーム」を表す組み込み定数です。これは、コマンドラインでスクリプトを実行した際に、ユーザーがキーボードから入力する内容などをプログラムが読み取るための標準的な入り口として機能します。この定数自体は引数を持ちませんが、ファイルやネットワーク接続などと同様に、データフローの「入り口」となるリソース(resource型)として扱われます。

提供されたサンプルコードは、このSTDINを使ってユーザーがキーボードから入力したテキストを一行読み込み、それを画面に表示する基本的な例です。fgets()関数は、引数として渡されたストリームからデータを読み取る役割を持ち、ここではSTDINがその入力元として指定されています。fgets(STDIN)と記述することで、標準入力から得られた一行が変数$inputLineに格納されます。fgets()は読み込みに成功すると文字列を、失敗するとfalseを戻り値として返しますので、エラーハンドリングのために戻り値のチェックが行われています。また、fgets()は改行文字を含むため、trim()関数で不要な空白や改行文字を削除し、整形された入力を表示しています。このスクリプトをコマンドラインで実行すると、ユーザーは直接入力を行い、プログラムがそれを受け取って処理する様子を確認できます。

このサンプルコードのSTDINは、プログラムがコマンドラインで実行された際に、キーボードなどからの標準入力を受け取るための定数です。fgets()関数で読み込む際、入力に失敗するとfalseを返すため、必ずその戻り値をチェックしエラー処理を行うようにしてください。また、fgets()は行末の改行文字(\n)も読み込むため、不要な場合はtrim()関数などで取り除く必要があります。STDINを用いた入出力は、主にWebアプリケーションではなく、コマンドラインインターフェース(CLI)で動作するスクリプトで利用されることを理解しておきましょう。

PHP STDIN から入力を受け取る

1<?php
2
3/**
4 * 標準入力 (STDIN) から一行のテキストを読み込み、トリムして返します。
5 *
6 * STDINは、プログラムがコマンドラインからユーザーの入力などを受け取るための
7 * 事前定義されたファイルポインタリソースです。
8 *
9 * @return string 標準入力から読み込まれた、空白文字が除去された文字列。
10 *                入力エラーが発生した場合はエラーメッセージを返します。
11 */
12function readLineFromStdin(): string
13{
14    // ユーザーに入力を促すメッセージを表示します。
15    echo "何か入力してください: ";
16
17    // STDINから一行を読み込みます。fgetsは改行コードまたはファイルの終端まで読み込みます。
18    // STDINはPHPが内部的に提供する標準入力ストリームを指す定数です。
19    $input = fgets(STDIN);
20
21    // 入力に失敗した場合(例: ストリームが閉じている、エラーが発生したなど)
22    if ($input === false) {
23        return "入力エラーが発生しました。";
24    }
25
26    // 読み込んだ文字列の先頭と末尾から空白文字(改行コード含む)を除去して返します。
27    return trim($input);
28}
29
30// 関数を呼び出し、ユーザーの入力を取得します。
31$userInput = readLineFromStdin();
32
33// 取得した入力を画面に出力します。
34echo "あなたが入力したのは: " . $userInput . "\n";
35
36?>

このPHPサンプルコードは、プログラムがユーザーからキーボードを通じてテキスト入力を受け取る基本的な方法を示しています。ここで用いられている「STDIN」は、PHPに組み込まれている特別な定数で、「標準入力」を表します。これは、コマンドラインで実行されるプログラムが、ユーザーからのテキストデータなどを読み込む際に利用するファイルポインタリソースであり、PHP 8ではresource型として扱われます。

コード内のreadLineFromStdin関数は、ユーザーに入力を促すメッセージを表示した後、fgets(STDIN)を実行して標準入力から1行分のテキストを読み込みます。fgetsは、改行コードまたはファイルの終端までを読み取る関数です。読み取られた文字列には、ユーザーがEnterキーを押したことによる改行コードなどが含まれる可能性があるため、trim()関数を使って文字列の先頭と末尾にある不要な空白文字や改行コードを除去し、整形します。

入力処理中にエラーが発生し、fgets()falseを返した場合は、「入力エラーが発生しました。」というメッセージを返します。この関数は引数を持たず、標準入力から読み込まれて空白文字が除去されたstring型のテキストを戻り値として返します。最終的に、関数によって取得されたユーザー入力は変数$userInputに格納され、画面に出力されます。

このサンプルコードは、PHPスクリプトをコマンドラインで実行する際に、ユーザーからのテキスト入力を受け取る方法を示しています。STDINは標準入力を表す定数ですが、Webアプリケーションでは通常$_GET$_POSTなど別の方法で入力を扱いますので、混同しないよう注意が必要です。fgets()関数は読み込みが成功すると改行コードを含む文字列を返しますが、失敗した場合はfalseを返します。そのため、trim()関数で余分な空白や改行コードを除去し、falseの確認によるエラー処理を必ず行うようにしてください。本コードはターミナルで直接実行することで動作します。

PHPでSTDINから複数行入力する

1<?php
2
3/**
4 * 標準入力 (STDIN) から複数行のテキストを読み込み、表示する関数。
5 * 'exit' と入力してEnterを押すことで、入力プロセスを終了します。
6 */
7function readMultipleLinesFromStdin(): void
8{
9    echo "複数行の入力を受け付けます。'exit' と入力してEnterで終了します。\n";
10    echo "--------------------------------------------------------\n";
11
12    $inputLines = [];
13    $lineNumber = 1;
14
15    // 無限ループで複数行の入力を受け付ける
16    while (true) {
17        echo "行 {$lineNumber}: ";
18        // STDINから1行ずつ読み込む
19        // fgets() はファイルポインタから1行読み込み、エラーまたはEOFで false を返す
20        $line = fgets(STDIN);
21
22        if ($line === false) {
23            // EOF (End of File) または読み取りエラーの場合、ループを終了
24            break;
25        }
26
27        // 読み込んだ行の先頭と末尾にある空白文字(改行コードを含む)を除去
28        $trimmedLine = trim($line);
29
30        // 'exit' が入力されたらループを終了
31        if (strtolower($trimmedLine) === 'exit') {
32            break;
33        }
34
35        // 空行でない場合のみ、入力された行を保存
36        if ($trimmedLine !== '') {
37            $inputLines[] = $trimmedLine;
38        }
39        
40        $lineNumber++;
41    }
42
43    echo "--------------------------------------------------------\n";
44    echo "入力された行:\n";
45
46    // 保存されたすべての行を表示
47    if (empty($inputLines)) {
48        echo "  (入力された行はありませんでした)\n";
49    } else {
50        foreach ($inputLines as $index => $content) {
51            echo "  " . ($index + 1) . ": " . $content . "\n";
52        }
53    }
54}
55
56// 関数を実行し、標準入力からの入力を開始
57readMultipleLinesFromStdin();

このPHPコードは、STDINというPHPの内部定数を利用して、コマンドラインからの標準入力を複数行にわたって受け付け、その後に入力された内容を表示するサンプルです。STDINは、キーボードからの入力など、プログラムへの標準的な入力ストリームを表す「リソース」です。この定数自体は引数を取らず、ファイルポインタと同様に扱えるリソース型を返します。これにより、プログラムが外部からデータを受け取ることが可能になります。

コードでは、readMultipleLinesFromStdin関数が定義されており、この関数内で無限ループを用いてユーザーからの入力を待ち続けます。具体的には、fgets(STDIN)関数が用いられ、STDINで指定された入力ストリームから1行ずつテキストを読み込みます。fgets()は、入力された1行を文字列として返し、入力の終端(EOF)やエラーが発生した場合にはfalseを返します。読み込まれた行はtrim()関数で前後の空白や改行コードが除去され、'exit'と入力されるとループが終了します。空行以外の入力は配列に保存され、最終的にすべての入力行が順に表示されます。このコードは、ユーザーからの対話的な入力を処理する基本的な方法を示しています。

このサンプルコードでは、STDINが標準入力へのファイルポインタ(resource型)として扱われ、fgets()のようなファイル操作関数でデータを読み込む点が重要です。fgets()は読み込んだ行の末尾に改行コードを含むため、trim()関数を使って不要な改行や空白文字を除去する処理が不可欠です。これを怠ると、意図しない改行がデータに含まれたり、比較処理が正しく機能しなかったりする原因になります。

また、while (true)のような無限ループで入力を受け付ける際は、プログラムが終了しなくなる事態を防ぐため、ユーザーが意図的に終了できる条件(例: 'exit'の入力)や、入力ストリームの終端(EOF)で自動的に終了する条件を必ず設定してください。これにより、プログラムの安定性と安全性が確保されます。

関連コンテンツ