ファイル操作の基本
そふぃのPHP入門 >> PHP実践リファレンス >> ファイル操作 >> ファイル操作の基本

ファイル操作の基本

ファイル操作の基本

まず、PHPで「ファイル」というものがどのように扱われるか解説したいと思います。ファイルを操作したい場合、ファイルは外部のリソースとして扱われます。外部のリソースと言っても分かりにくいでしょうが、現在実行中のスクリプト以外の場所にあるので「外部」です。

「リソース」は直訳すると「資源」とか「資料」・「手段」なんて意味になります。つまり、現在実行中のスクリプト以外の場所にあるが、スクリプト実行に必要な資源を記述したファイル・・・ってな事になりますか^^;。余計訳分からなくなりそうです。「資源」というのはこの際「値」でも「スクリプト」でも何でもいいのですが、外部(今回の場合はファイル)から読み込むなりなんなりして現在のスクリプトに利用するものだと思って下さい。

こういった外部のリソースを利用するために必要になるのが、そのリソースを操作するためのハンドラです。「ハンドラ」??と思われたは「ハンドル」って読み替えて下さい。例えは極端になりますが、車の運転に使うあれですw。車がどうやって動くかの仕組みが分からなくてもハンドルを操作すれば動きます。アクセルとかブレーキもあるじゃん、などの突っ込みはこの際ナシにしてもらいたいのですがw、とにかく外部のリソースを扱うためにはそのリソース専用のハンドラを取得する必要があります。ハンドラを取得したらあとはそのハンドルを利用して操作していくだけです。

ハンドラの取得と破棄

ハンドラの取得

ハンドラを取得するのにはPHPの関数を使います。ファイル操作にはファイル操作専用の、データベース接続にはデータベース専用のハンドラ取得関数が用意されていて、ファイル操作ならfopen()関数です。

PHPマニュアル リソース型の一覧

fopen()関数は「ファイルを開く」関数です。ファイルの中身を操作するためには、まずファイルを開かないといけませんが、fopen()関数でファイルを開いた時に自動的にハンドラを取得してくれます。ちなみに、ファイルの場合のハンドラは「ファイルポインタ」という呼び方をされる事も多いです。「ファイルポインタ」は現在ファイルのどの位置にいるかを示すポインタです。テキストエディタなどだと現在の編集点で、「|」マークがちかちかしてたりすると思いますが、そういったファイル内での現在位置を「ファイルポインタ」と言います。

参考関数

  • fopen() ---- ファイルまたはURLを開く

書式

  • resource fopen( string filename , string mode [, int use_include_path ] )

返り値の型がresourceになっていますが、fopen()関数は、開いたファイルを操作するためのハンドラ(リソース型)を返してくれます。ファイル操作は、このハンドラを変数に格納しておいていろいろな処理に使う、という流れになります。

第1引数には開きたいファイルへのパスを指定します。

第2引数の「モード」で???となるでしょうが、これは「読み取り専用モード」だとか「上書きモード」などの事です。詳しい指定方法などは実際に使っていく時に覚えてもらいますので後述します。

第3引数の「インクルードパス」はphp.ini(PHPの設定ファイル)に定められている「インクルードパス」という場所を検索するかどうかのオプション引数です。オプションなので省略可能で、省略した場合は検索しません。この引数はオプションですし、ここの解説ではインクルードパスじゃなくて実際のパスを記述していきますので、使いません。使い方次第では便利なので、こんなもんもある・・・くらいで覚えておいて下さい。

ハンドラの破棄

開いたファイルは閉じましょう!!という事で「ファイルを閉じる」って操作が最後につきます。この「ファイルを閉じる」はfclose()関数で行います。fclose()関数は「ファイルを閉じる」関数ですが、PHPではこの時に自動で取得したリソース(この場合はファイルのハンドラ)を破棄(開放)してくれます。

参考関数

  • fclose() ---- ファイルポインタを閉じる

書式

  • bool fclose( resource handle )

引数にfopen()関数で取得したハンドラ(ファイルポインタ)を指定すると、ファイルを閉じてリソースの破棄(開放)を行います。

成功した場合にTRUE・失敗した場合にFALSEを返します。

ファイル操作について」で紹介したreadfile()関数はこういったハンドラの取得や破棄も関数の内部に組み込まれていて、fopen()関数でハンドラを取得する必要はありません。こういった関数は他にもあり、知っていると非常に便利に使う事もできますが、基本的には「ファイルを開く―fopen()」という操作から始まって「ファイルを閉じる―fclose()」って操作で終わると思って下さい。

ファイルのオープンとクローズ

通常は、「ファイルを開く」と「ファイルを閉じる」の間に色々な処理が入るわけですが、例えばどんな処理があるでしょうか。テキストエディタなどではファイルを開くと内容を読み込んで表示してくれますが、これはエディタを起動する時に「ファイルを開く」「ファイルの内容を読み込む」「ファイルの内容を表示する」ってのを一気にやってくれてるからです。PHPではこれを一つ一つやっていかなくてはなりませんが、大抵の処理はPHPの関数でできます。

今後はそういったファイル操作がらみのPHP関数を紹介していく事になると思いますが、その前にfopen()関数とfclose()関数を使ったサンプルです。

  1. <?php
  2. $fp = @fopen("sample.txt","r");
  3. fclose($fp);
  4. ?>

上記のサンプルでは、ファイルを開いたらすぐ閉じているので何か起こったようには見えません。第2引数のモードに「r」を指定していますが、これは「読み取り専用モード」です。「上書きモード」っていうモードにしちゃうとファイルの中身が削除されちゃうのでとりあえず「読み取りモード」にしておいただけですが、上記のサンプルの場合は「ファイルの読み取り」って処理も行っていません。そういった処理は次から紹介していきたいと思います。

fopen()関数の前にはエラー制御演算子を置いてファイルが開けなかった場合などにエラーが出力されてしまうのを防いでいます。ファイル操作関連の関数にはエラー制御演算子を使用してエラーを出力させないようにする事が多いです。

ついでですが、ファイルポインタ(ハンドラ)を格納しておく変数名には「$fp」とか「$handle」が使われる事が多いです。$fpはファイルポインタの略でしょうし、$handleはそのまんまですね。自分でスクリプトを組む時も、一応一般的な変数名をつけておいた方が混乱が少なくて済むと思います。