忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/04/26 17:40 |
PHP1-13:クラスを作ってみる:ファイルに保存

とりあえず役に立つクラスを作成してみましょう。

PHPでは変数へのデータ保存は非常に簡単に行えます。
多くの言語では面倒な、セッションへのデータの保存や取り出しも無闇に簡単です。
しかしファイルに対する操作は多少の手間が必要です。
ファイルに保存するクラスを作って簡単に読み書きできるようにしてしまいましょう。

尤もこれが実用的かというと、すぐDBに移行するので微妙なところですが。

filereader.class.php 

class fileReaderClass{

#------------------------------------------------------------
#内部変数
    protected $file_name=NULL;
    protected $contents=NULL;

#------------------------------------------------------------
#コンストラクタ
    public function __construct($file_name){

        $tmp=file($file_name,FILE_SKIP_EMPTY_LINES);
        if($tmp===false){
            return false;
        }
        
        foreach($tmp as $tmp_loop){
            $tmp_ex=explode("\t",$tmp_loop,2);
            $tmp_array[$tmp_ex[0]]=trim($tmp_ex[1]);
        }

        $this->file_name=$file_name;
        $this->contents=$tmp_array;
        return true;
    }

#------------------------------------------------------------
#デストラクタ
    public function __destruct(){

        $tmp='';
        foreach($this->contents as $key=>$val){
            $tmp.=$key."\t".$val."\n";
        }
        file_put_contents($this->file_name,$tmp);
    }

#------------------------------------------------------------
#変数読み出し
    public function getParam($key){
        
        if(isset($this->contents[$key])){
            return $this->contents[$key];
        }else{
            return false;
        }
    }

#------------------------------------------------------------
#変数書き込み
    public function setParam($key,$val){
        $this->contents[$key]=$val;
        return true;
    }

#↓クラスのおわり
}


まず__constructですが、これはコンストラクタと呼ばれ、newでクラスをインスタンス化した時点で自動的に実行されます。
newするときにファイル名を与えると、そのファイルの中身が連想配列に読み込まれます。

その後、getParamおよびsetParamでファイルの読み書きを行います。
最後にデストラクタですが、これはクラスへの参照が無くなったときに自動的に実行されます。
「クラスを最後に使用したとき」ではなく「参照が無くなったとき」ですので、順番を厳密に管理するときは注意が必要です。

使用する側では以下のようにします。

file.php 

    require_once('./filereader.class.php');
    $fp=new fileReaderClass('sample.txt');
    
    $a=$fp->getParam('b');
    $fp->setParam('d','sample2');

    print($a);


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


ファイルポインタを明示的に破棄した場合、相対パスでもきちんと保存されるようです。
どういうことなのでしょう?
PR


2008/08/11 14:01 | Comments(1) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

http://www.phppro.jp/qa/1381

で概ね解決しました。

unset($fp)等でファイルの実行中にデストラクタが起動されると、その場合のカレントディレクトリは現在のディレクトリになります。

しかし、何もせずに終了した場合、デストラクタのカレントディレクトリはApacheのディレクトリになってしまいます。

なんてこったい。
posted by 名無しさん必死だな URL at 2008/08/11 18:42 [ コメントを修正する ]

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Java1-5:JavaServletでカスタムタグ | HOME | JSP1-5:カスタムタグでHelloWorld>>
忍者ブログ[PR]