x.x.x.x

| HOME | FrontPage | 記事編集 | RSS |

configファイルの読み書き   PHP::5

  1. 1. configファイルの上書き保存
  2. 2. configファイル名の指定

PHPのclassに慣れるネタが無かったので、設定ファイルの読込クラスを作ってみた。

<?php
class Config {
    public $cnf = array();
    function Config() {
        $lines = file('config.txt');
        foreach($lines as $line) {
            list($name,$value) = split("=", $line,2);
            if($name != '') $conf[$name] = rtrim($value,"\r\t\n");
        }
        $this->cnf = $conf;
    }
}
$obj = new Config();
print $obj->cnf['a'] . "<br>\n";
print $obj->cnf['b'] . "<br>\n";
print $obj->cnf['c'] . "<br>\n";
?>

上のスクリプトは設定ファイルconfig.txtを一度だけ読み込んで連想配列$cnfに保存し、インスタンス$obj経由で値を参照するスクリプトです。PHP4ではclass名と同名のfunctionは勝手にコンストラクタと認識され、new時に一度だけ実行されます。ちなみにPHP5ではfunction __construct()がコンストラクタ(デストラクタは__destruct()。PHP4はデストラクタ無し)となり、両方ある場合はPHP4方式のコンストラクタが無視されます。config.txtの内容が

a=1000
b=2000
c=3000

の時、表示は

1000<br>
2000<br>
3000<br>

となります。$cnfの内容をconfig.txtに保存するfunctionを追加すれば、なかなか優秀な設定管理クラスになります。この程度なら単なる参照なので、オブジェクト指向とは言わないでしょう。僕が日頃イヤだと言ってるオブジェクト指向はもっと過激なものです。

1. configファイルの上書き保存

書き込み機能を足したConfigクラスが以下です。

class Config {
    public $cnf = array();
    private $filename = 'config.txt';
    function Config() {
        $lines = file($this->filename);
        foreach($lines as $line) {
            list($name,$value) = split("=", $line);
            if($name != '') {
                $conf[$name] = rtrim($value,"\r\t\n");
            }
        }
        $this->cnf = $conf;
    }
    function overWrite() {
        $fh = fopen($this->filename, 'wb');
        foreach($this->cnf as $key => $value) {
            fwrite($fh, "$key=$value\n");
        }
        fclose($fh);
    }
    function __destruct() {
        unset($this->cnf);
    }
}

現在の$cnfの内容を丸々config.txtに上書き保存します。
下の呼び出しはconfig.txtのa=1000をa=7000に書き換えて上書き保存します。

$obj = new Config();
$obj->cnf['a'] = 7000;
$obj->overWrite();
unset($obj);

最後にインスタンスを破棄します。ついでにファイル名の指定箇所が複数になったのでprivateで$filenameを作ってみた。クラス外から

print $obj->filename;

などとするとFatal errorになります。

2. configファイル名の指定

下の改造版はconfigファイル名を指定できます。
指定があればそのファイル名、指定が無ければconfig.txtを更新します。

class Config {
    public $cnf = array();
    function Config($filename = 'config.txt') {
        $lines = file($filename);
        foreach($lines as $line) {
            list($name,$value) = split("=", $line);
            if($name != '') {
                $conf[$name] = rtrim($value,"\r\t\n");
            }
        }
        $this->cnf = $conf;
    }
    function overWrite($filename = 'config.txt') {
        $fh = fopen($filename, 'wb');
        foreach($this->cnf as $key => $value) {
            fwrite($fh, "$key=$value\n");
        }
        fclose($fh);
    }
    function __destruct() {
        unset($this->cnf);
    }
}

たとえば以下の呼び出しを受けた時、

$obj = new Config();
$obj->cnf['a'] = 6000;
$obj->overWrite('config2.txt');
print $obj->cnf['a'] . "<br>\n";
print $obj->cnf['b'] . "<br>\n";
print $obj->cnf['c'] . "<br>\n";

1行目のnew時はファイル名の指定が無いのでconfig.txtを参照します。
3行目のoverWrite時はファイル名の指定があるので指定されたconfig2.txtを更新します。

BlogMode speed member / 2008.02.11 00:28

These pages are designed for NN7 & IE6.
BBSWiki ver.1.50 Final blogmode.
Copyleft (!C) 2005-2007 SUICIDE BLONDE JP.
All Lefts Reserved.

Valid XHTML 1.0 Strict Valid CSS!