PHP 備忘録 | メシのタネ

PHP_Logo
このエントリーをはてなブックマークに追加

PHPで標準入力を行う方法

 2014/04/21

追記:2014/11/7 : ほぼ説明されていないストリームについてや、名前すら出てこないファイルディスクリプタについて追記しました。多分前よりは分かりやすくなってるはずです!多分!PHPで標準入力を受け取る方法とかのがタイトルとして正しいのかな・・・なんか行うってのは違う気がします。とにかく修正しました。

プログラミングで使われる言葉ってややこしい。これが結構ネックになって経験無い人は、興味持ってても勉強しなくなると思うんです。

例えば、、、言葉知らないから検索する→知らない言葉が2つに増える→2つとも説明見たけどぜんぜんわかんない→youtubeを見る→良い時間なので寝るって言う流れに僕はよくなります。

この標準入力を調べた時だって、

PHPでは様々な入出力ストリームを提供しています

って言われてあんじゃストリームってってなって検索すると

データの入力または出力の機能を提供する抽象データ型である

で、なにその抽象データ型ってって検索すると

データ構造とそれを直接操作する手続きをまとめてデータ型の定義とすることでデータ抽象を実現する手法またはそのひとまとまりとして定義されたデータ型を言う。

もはやただ日本語であるだけの日本語になって理解できなくなる。だから僕は、頭の中でどういう事かイメージできる段になったらその事についてその時はもう調べません。

必要な事はちゃんと調べるようにしてます。

ストリームとは?

ストリームとは流れです。稼動しているプログラムがファイルへとアクセスする際バイトのデータが流れていきます。その流れていくデータが通る道の名前をストリームと言います。このストリームという奴はカーネルっていうOSの基本機能を実装したソフトウェアによって制御されています。

標準入力

標準入力とは何か。データの入力または出力の機能を提供する抽象データ型である
これWikipediaでぐぐったんですが、続きがありまして、特にファイルの入出力には、標準ストリームと呼ばれる特別なストリームが用意されていることもある。って部分があります。これについて調べてみると、

プログラムとその環境(通常は端末)を実行前から接続している入出力チャネルである。
標準入力 (standard input)、標準出力 (standard output)、標準エラー出力 (standard error) と呼ばれている。

とあります。

つまり、標準入力とは、ストリームの種類の標準ストリームの標準入力、標準出力、標準エラー出力この実行前から接続しているチャネルの中の1種類なのです。何をするのかといえば、キーボードから入ってくるデータ読み込みます。

ちょっとこの説明だと乱暴過ぎる気がします。

ちょっとこの記事から時間がたった僕の思う標準入力っていうのは、プログラムが稼動した時点でファイルディスクリプタによって予約されている0番stdin標準入力と1番stdout標準出力と2番stderror標準エラーのうちの0番標準入力をストリームが流れていく様子を標準入力ってゆうんじゃないかなと思います。

ちなみにstdinはstandardinputの略です。決してすたじんとか変な風に覚えないようにしましょう。僕はそう覚えました。すたじんって覚えました。

ファイルディスクリプタ

プロセスに引っ付くint型の整数ですが、コマンドを実行した際にプロセスで使われると意味合いが代わってくる物です。ストリームはkarnelが管理しているので、ファイルディスクリプタからの管理が出来ません。なので、プロセス(稼働中のプログラム)に引っ付いて入り口や出口の役割を果たしています。この入り口や出口には番号があって、0番が入力、1番が出力、2番がエラー出力っていう役割を持ってます。

標準入力についての説明記事

標準入力、標準出力とは何か?
絵で見てわかるファイルディスクリプタ・パイプ・リダイレクト

標準入出力の仕組みが凄い分かりやすく載ってます。参考にしてみてください。

PHPから標準入力

PHPでも、cuiの作成が出来るといわれています。なぜそういわれるのかといえば、

PHPでは様々な入出力ストリームを提供しています

からだと思います。

そのストリームを利用して、文字をコンソールに表示させます。コンソールを立ち上げて、php -vを打ってください。パスが通ってたら、準備完了です。touch でファイルを作ります。touchはLinuxのファイル作成コマンドです。


<?php
//sample.php
$l = trim(fgets(STDIN));
?>

このプログラムを

php filename.php

2014/11/7: 修正

で実行すると、何か入力しないといけない雰囲気になります。この雰囲気の中aを$lに代入した場合string型のサイズが1でaとなります。で今はtrimつけてるのでそのようになりますが、

<?php
//sample.php
$l = fgets(STDIN);
?>

このコードでaを$lに代入した場合stringは2でa\nになります。標準入力は1行を$lに保存します。1行なのでエンター押された時の改行も入るんだと思います。trimで\nを取ってます。

2行以上標準入力を行う場合

この方法だと1行だけしか標準入力を行えません。2行以上やる場合繰り返しをする必要があります。

<?php
$myarray = array();
for($i=0; $i<5; $i++)
{
  $l = trim(fgets(STDIN));
  $myarray[$i] = $l;
}

var_dump($myarray);

あんまし使うとこないでしょうけど、僕はpaizaってサイトでコード試験するのにこれが必要になったので、その時に覚えました。他には競技プログラミングとかcui作りたいとかそういう人は覚えておいた方が良いんではないでしょうか!


このエントリーをはてなブックマークに追加

1 件のコメント


PHPでのコンソール入力に関して  2015-10-19 21:28:50
[…] http://mikaduki.info/webprogram/php/983/ […]

コメント

"PHPで標準入力を行う方法"
でメシのタネのおすすめを検索したよ!

プログラミング備忘録 | メシのタネ