とりあえず役に立つクラスを作成してみましょう。
PHPでは変数へのデータ保存は非常に簡単に行えます。
多くの言語では面倒な、セッションへのデータの保存や取り出しも無闇に簡単です。
しかしファイルに対する操作は多少の手間が必要です。
ファイルに保存するクラスを作って簡単に読み書きできるようにしてしまいましょう。
尤もこれが実用的かというと、すぐDBに移行するので微妙なところですが。
filereader.class.php
class fileReaderClass{ |
まず__constructですが、これはコンストラクタと呼ばれ、newでクラスをインスタンス化した時点で自動的に実行されます。
newするときにファイル名を与えると、そのファイルの中身が連想配列に読み込まれます。
その後、getParamおよびsetParamでファイルの読み書きを行います。
最後にデストラクタですが、これはクラスへの参照が無くなったときに自動的に実行されます。
「クラスを最後に使用したとき」ではなく「参照が無くなったとき」ですので、順番を厳密に管理するときは注意が必要です。
使用する側では以下のようにします。
file.php
require_once('./filereader.class.php'); |
sample.txt(空白ではなく、タブ区切りです)
a sample1 b sample2 c sample3 |
$fp=new fileReaderClass('a.txt');
の行を実行した時点でコンストラクタが実行され、sample.txtが読み込まれ、クラス内のメンバ変数$contentsに入れられます。
次のgetParamでは、$contents['b']の値、すなわち'sample2'を取得します。
setParamで$contentsに('d'=>'sample4')という配列を追加しています。
unset($fp)でこのクラスへの参照を削除すると、同時にデストラクタが実行され、現在の$contentsの値をファイルに書き込みます。
これで一通りファイルを読み書きするクラスが完成しました。
タブを含む変数名、改行を含む変数内容は使用できませんが、とりあえずはいいでしょう。
さて、書き込み後のsample.txtを見てみます。
sample.txt
a sample1 b sample2 c sample3 |
ってあれ?
デストラクタをちょこっと変更して確認してみます。
public function __destruct(){ $tmp=''; foreach($this->contents as $key=>$val){ $tmp.=$key."\t".$val."\n"; } file_put_contents($this->file_name,$tmp); var_dump($this->file_name); var_dump(file_get_contents($this->file_name)); } |
string(8) "file.txt"
string(40) "a sample1 b sample2 c sample3 d sample4 "
あれれ?
きちんと取得できてますね。
public function __destruct(){ $tmp=''; foreach($this->contents as $key=>$val){ $tmp.=$key."\t".$val."\n"; } file_put_contents('C:\xampp\htdocs\file.txt',$tmp); } |
file.txt
a sample1 b sample2 c sample3 d sample4 |
フルパスを与えると保存できてます。
$this->file_nameって何処なんだ?
はて??
今度は呼び出し側を変更してみます。
file.php
require_once('./filereader.class.php'); $fp=new fileReaderClass('sample.txt'); $a=$fp->getParam('b'); $fp->setParam('d','sample2'); unset($fp); print($a); |
file.txt
a sample1 b sample2 c sample3 d sample4 |
ファイルポインタを明示的に破棄した場合、相対パスでもきちんと保存されるようです。
どういうことなのでしょう?
で概ね解決しました。
unset($fp)等でファイルの実行中にデストラクタが起動されると、その場合のカレントディレクトリは現在のディレクトリになります。
しかし、何もせずに終了した場合、デストラクタのカレントディレクトリはApacheのディレクトリになってしまいます。
なんてこったい。