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

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

サンプル・プログラム

サンプル・プログラムの解説:文字カウント・クラス

0068: /**
0069:  * 文字カウント・クラス
0070: */
0071: class countKanji {
0072:     //プロパティ
0073:     private $moji  = 0;      //文字数
0074:     private $kanji = 0;      //漢字の数
0075:     private $kuten = 0;      //句点の数
0076:     private $toten = 0;      //読点の数
0077:     private $kaigyo = 0;     //改行の数
0078:     private $flag = FALSE;       //countメソッドを実行したかどうか
0079: 
0080: /**
0081:  * 文字数をカウントする
0082:  * @param string $text 入力テキスト
0083:  * @return なし
0084: */
0085: public function count($text) {
0086:     $len = mb_strlen($text);
0087:     for ($i = 0; $i < $len$i++) {
0088:         $ch = mb_substr($text$i, 1);
0089:         $this->moji++;
0090:         if (preg_match("/[一-龠]+/u", $ch) == 1)    $this->kanji++;
0091:         if (preg_match("/[。。..]+/u", $ch) == 1)    $this->kuten++;
0092:         if (preg_match("/[、、,,]+/u", $ch) == 1)   $this->toten++;
0093:         if (preg_match("/[\n\r]+/u", $ch) == 1)    $this->kaigyo++;
0094:     }
0095:     $this->flag = TRUE;
0096: }
0097: 
0098: /**
0099:  * 文字数を返す
0100:  * @return int 数/FALSE:countメソッド未実行
0101: */
0102: public function moji() {
0103:     return $this->flag ? $this->moji : FALSE;
0104: }
0105: 
0106: /**
0107:  * 漢字数を返す
0108:  * @return int 数/FALSE:countメソッド未実行
0109: */
0110: public function kanji() {
0111:     return $this->flag ? $this->kanji : FALSE;
0112: }
0113: 
0114: /**
0115:  * 句点数を返す
0116:  * @return int 数/FALSE:countメソッド未実行
0117: */
0118: public function kuten() {
0119:     return $this->flag ? $this->kuten : FALSE;
0120: }
0121: 
0122: /**
0123:  * 読点数を返す
0124:  * @return int 数/FALSE:countメソッド未実行
0125: */
0126: public function toten() {
0127:     return $this->flag ? $this->toten : FALSE;
0128: }
0129: 
0130: /**
0131:  * 改行数を返す
0132:  * @return int 数/FALSE:countメソッド未実行
0133: */
0134: public function kaigyo() {
0135:     return $this->flag ? $this->$kaigyo : FALSE;
0136: }
0137: }

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

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

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

サンプル・プログラムの解説:インスタンス

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

0256: }
0257: 
0258: $HtmlBody = makeCommonBody($sour$count);
0259: 
0260: // 表示処理
0261: echo $HtmlHeader;
0262: echo $HtmlBody;
0263: echo $HtmlFooter;
0264: 
0265: /*
0266: ** バージョンアップ履歴 ===========================================
0267:  *
0268:  * @version  1.0  2015/06/06
0269: */
0270: ?>

クラスからインスタンスを生成するには 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