PHPオブジェクト指向実践

カウンター

カウンタークラスの設計

個人のサイトで組み込むシステムとして簡単なところでカウンターでも作ってみることにします。
カウンターもいろんなことを考慮すれば多少複雑にもなりますが、最低限の機能の簡易版です。

とりあえずはカウンタークラスでも作ってみます。
カウンターとして最低限、必要な機能ってなんでしょうか。

  • サイトにアクセスされたときにカウントを1プラスする
  • 現在のカウント値を取得して表示する。

そんなところだと思います。
そのまんま、クラス化してみます。

Counter.php
<?php

class Counter
{
    // カウンター値取得
    public function get()
    {
    }

    // カウンター加算処理
    public function increment()
    {
    }
}

?>

Counterクラスを作成し、メソッドとしてカウンター加算処理の「increment」メソッド、
カウンター値取得処理として「get」メソッドを定義しました。

このままでは単なる枠を用意しただけで何の機能も持ちませんから、メソッドの中身を書いていきます。

が、カウンターを作る上でまず考えなければならないことがあります。
カウント値をどうやって保存するか。
当然訪問者があるたびに加算し、その値をどこかに保存しなければなりません。

データの保存には二つの選択肢があります。
データベースとテキストファイルです。
しかし今回のような簡易なカウンターだけの為にデータベースは大げさですので、
ここはテキストファイルに保存することにします。

ということでそれを踏まえてメソッドの中身を書いていきます。

Counter.php
<?php

class Counter
{
    // カウント値保存ファイル名
    const COUNT_FILE_NM = 'count.dat';
    
    // カウンター値取得
    public function get()
    {
        $cnt = 0;
        if (true == file_exists(self::COUNT_FILE_NM)) {
            // データ保存ファイルからデータ取得
            $fp = fopen(self::COUNT_FILE_NM, 'r');
            $data = trim(fgets($fp));
            fclose($fp);
            
            // データが数値ならカウンター値として取得
            if (true == is_numeric($data)) {
                $cnt = $data;
            }
        }
        return $cnt;
    }
    
    // カウンター加算処理
    public function increment()
    {
        // 現在のカウント値を取得
        $cnt = $this->get();
        // カウントを1増やす
        $cnt++;
        // データ保存ファイルに上書きする
        $fp = fopen(self::COUNT_FILE_NM, 'w');
        fputs($fp, $cnt);
        fclose($fp);
    }    
}


?>

getCountメソッドはテキストファイルより現在のカウント値を取得して返すだけの単純なものです。
incrementメソッドはgetメソッドを使用して現在のカウント値を取得し、1を加算し、ファイルに上書き保存するというものです。

ポイントとして、ファイル名は定数で定義しています。
クラス中のあらゆるところで共通に使用するため、定数として設定しておきます。
こうしておくことで、ファイル名を変えたいというときでも、定数さえ書き換えればすみます。

ちなみにカウンター値保存ファイルの内容はこんな感じで単に数値を保存しているだけになります。

count.dat
3

メインスクリプトの実装

カウンタークラスが出来上がったところで、
これを使用して処理を行うメインスクリプトが当然必要になります。
つまりURLにより指定されるHTMLに埋め込まれるPHPスクリプトです。

通常、カウンターはトップページに表示されます。
なので今回はトップページのスクリプト(index.php)に組み込む事にします。

index.php
<?php

require_once '../class/counter/Counter.php';

// カウンタークラスインスタンス生成
$counter = new @CCounter@();
// カウンターを加算
$counter->increment();
// カウンター値取得
$cnt = $counter->get();

?>

<html>
<head>
<title>PHP講座トップページ</title>
</head>
<body>
<h1>PHP講座</h1>
<p>あなたは<?php echo $cnt; ?>番目の訪問者です</p>

</body>
</html>

HTMLに埋め込むスクリプトは、
クラスを使用して処理の流れを記述するような形になります。
処理のロジックはクラスのメソッドに記述されているため、
このメインのスクリプトはとてもスッキリして何をやっているかがわかりやすいと思います。



ちなみに今回のファイル配置は以下のような感じになっていますのでご参考まで。

public_html/
  ∟class/
    ∟counter/
      ∟Counter.php  
  ∟index.php
  ∟count.dat