PHPでクラスを使ってテキストの読みやすさを調べる

(1/1)
PHPにはオブジェクト指向プログラミングを行うための仕組みとしてクラスが用意されている。
ある程度まとまった処理を別プログラムで再利用したり、複雑なデータ構造を扱う際、クラスを使うと効果がある。
今回は、入力したテキストの文字数をカウントし、見やすい文章かどうかを調べるプログラムを、クラスを使って組み立ててみることにする。

サンプル・プログラムの実行例

目次

サンプル・プログラム

圧縮ファイルの内容
countKanji.phpサンプル・プログラム本体。

解説:文字カウント・クラス

  92: // クラス ===========================================================
  93: /**
  94:  * 文字カウント・クラス
  95: */
  96: class countKanji {
  97:     //プロパティ
  98:     private $moji  = 0;     //文字数
  99:     private $kanji = 0;     //漢字の数
 100:     private $kuten = 0;     //句点の数
 101:     private $toten = 0;     //読点の数
 102:     private $kaigyo = 0;    //改行の数
 103:     private $flag = FALSE;  //countメソッドを実行したかどうか
 104: 
 105: /**
 106:  * 文字数をカウントする
 107:  * @param   string $text 入力テキスト
 108:  * @return  なし
 109: */
 110: public function count($text) {
 111:     $len = mb_strlen($text);
 112:     for ($i = 0$i < $len$i++) {
 113:         $ch = mb_substr($text, $i, 1);
 114:         $this->moji++;
 115:         if (preg_match("/[一-龠]+/u", $ch) == 1)    $this->kanji++;
 116:         if (preg_match("/[。。..]+/u", $ch) == 1)   $this->kuten++;
 117:         if (preg_match("/[、、,,]+/u", $ch) == 1)   $this->toten++;
 118:         if (preg_match("/[\n\r]+/u", $ch) == 1)     $this->kaigyo++;
 119:     }
 120:     $this->flag = TRUE;
 121: }
 122: 
 123: /**
 124:  * 文字数を返す
 125:  * @return  int 数/FALSE:countメソッド未実行
 126: */
 127: public function moji() {
 128:     return $this->flag ? $this->moji : FALSE;
 129: }
 130: 
 131: /**
 132:  * 漢字数を返す
 133:  * @return  int 数/FALSE:countメソッド未実行
 134: */
 135: public function kanji() {
 136:     return $this->flag ? $this->kanji : FALSE;
 137: }
 138: 
 139: /**
 140:  * 句点数を返す
 141:  * @return  int 数/FALSE:countメソッド未実行
 142: */
 143: public function kuten() {
 144:     return $this->flag ? $this->kuten : FALSE;
 145: }
 146: 
 147: /**
 148:  * 読点数を返す
 149:  * @return  int 数/FALSE:countメソッド未実行
 150: */
 151: public function toten() {
 152:     return $this->flag ? $this->toten : FALSE;
 153: }
 154: 
 155: /**
 156:  * 改行数を返す
 157:  * @return  int 数/FALSE:countメソッド未実行
 158: */
 159: public function kaigyo() {
 160:     return $this->flag ? $this->$kaigyo : FALSE;
 161: }
 162: }
 163: // End of Class ======================================================

クラスの定義は、class キーワードではじまるクラス名で行う。クラス名には、PHPの予約後以外でラベルとして有効な名前を付けることができる。
1つのクラスには、複数の定数、プロパティ(変数)、メソッド(関数)が含まれる。
クラス内の変数(メンバ変数)は プロパティ を呼ばれる。
ここでは、カウントした結果を代入するプロパティ $moji$kaigyo と、カウントを実行したかどうかの状態を代入するプロパティ $flag を用意する。各々に代入した初期値は、このクラスがオブジェクトとしてロードされたときに実体として代入される。
プロパティにはアクセス権として、public, private, protected を定義する。public 宣言されたクラスのメンバーには、どこからでもアクセス可能だ。 protected 宣言されたメンバーには、 そのクラス自身と継承したクラス、親クラスからのみアクセスできる。 private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできる。
ここでは、クラス外からのアクセスは不要なので、すべてprivate宣言としている。

メソッドの定義はユーザー関数と同じだ。プロパティと同様のアクセス権を設定する。
プロパティにアクセスするためには $this を用いる。
プロパティとメソッドの関係は、グローバル変数と関数の関係より管理がしやすいので、このように複数の処理から同じ変数にアクセスするような場合にはクラスを用いると、再利用性と保守性が高くなる。

各種文字数をカウントするメソッドは count である。
漢字や句読点をカウントするのに正規表現と関数  preg_match  を利用している。詳しくは、「PHPで日本語処理」を参照してほしい。

解説:インスタンス

class, new, インスタンス - PHP

 326: $count = new countKanji();
 327: 
 328: if ($sour !'') {
 329:     $count->count($sour);
 330: }

クラスからインスタンスを生成するには new キーワードを用いる。サンプル・プログラムではオブジェクトが変数 $count に代入される。
この段階で、はじめてクラスの中のプロパティやメソッドが使えるようになる。

メソッドを実行するには $count->count() のようにする。
このとき使う ->アロー演算子と呼ぶことがある。アロー演算子の左側にインスタンスの名前を、右側にそのクラスのメソッドまたはプロパティを配置すると覚えておいてほしい。

include_path を使う

クラスを再利用可能なライブラリとして、外部ファイルに分離することをよく行う。そして、組み込み関数  require_once  などを使って読み込む。
たとえば、「PHPで3ヶ月カレンダーを作る」で紹介したカレンダー・クラス pahooCalendar は、外部ファイル "pahooCalendar.php" に定義している。

外部ファイルは、さまざまなパスから呼ばれることがあるため、相対パスで指定することが面倒である。
そこでPHPには、外部ファイルを読み込むためのオプション設定 include_path が用意されている。設定ファイル php.ini に記述してやる。
Linux環境であれば、以下のようにセミコロン ; を介して複数のパスを設定する。
include_path=".:/php/includes;/php/PEAR"
Windows環境であれば、以下のように記述する。
include_path=".;c:\php\includes;c:\php\PEAR"


include_path は、 require_once  のほか、 require 、 include 、  fopen 、 file 、  readfile 、 file_get_contents  に影響を及ぼす。
実行時にオプション値を設定したい場合は、組み込み関数  set_include_path  を利用する。

参考サイト

(この項おわり)
header