サンプル・プログラムの実行例
サンプル・プログラム
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 ======================================================
1つのクラスには、複数の定数、プロパティ(変数)、メソッド(関数)が含まれる。
ここでは、カウントした結果を代入するプロパティ $moji ~ $kaigyo と、カウントを実行したかどうかの状態を代入するプロパティ $flag を用意する。各々に代入した初期値は、このクラスがオブジェクトとしてロードされたときに実体として代入される。
プロパティにはアクセス権として、public, private, protected を定義する。public 宣言されたクラスのメンバーには、どこからでもアクセス可能だ。 protected 宣言されたメンバーには、 そのクラス自身と継承したクラス、親クラスからのみアクセスできる。 private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできる。
ここでは、クラス外からのアクセスは不要なので、すべてprivate宣言としている。
メソッドの定義はユーザー関数と同じだ。プロパティと同様のアクセス権を設定する。
プロパティにアクセスするためには $this を用いる。
プロパティとメソッドの関係は、グローバル変数と関数の関係より管理がしやすいので、このように複数の処理から同じ変数にアクセスするような場合にはクラスを用いると、再利用性と保守性が高くなる。
各種文字数をカウントするメソッドは count である。
漢字や句読点をカウントするのに正規表現と関数 preg_match を利用している。詳しくは、「PHPで日本語処理」を参照してほしい。
解説:インスタンス
326: $count = new countKanji();
327:
328: if ($sour != '') {
329: $count->count($sour);
330: }
この段階で、はじめてクラスの中のプロパティやメソッドが使えるようになる。
メソッドを実行するには $count->count() のようにする。
このとき使う -> をアロー演算子と呼ぶことがある。アロー演算子の左側にインスタンスの名前を、右側にそのクラスのメソッドまたはプロパティを配置すると覚えておいてほしい。
include_path を使う
たとえば、「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 を利用する。
参考サイト
- クラスの基礎:PHP公式
- PHPオブジェクト指向プログラミング入門:@IT
- PHPで日本語処理:ぱふぅ家のホームページ
- PHP入門 第15回 クラスとオブジェクト:PHPプログラマのバリ・ポジ情報ブログ
- PHPはクラス名を変数で持ってnewとか出来るのか:シン石丸の電脳芸事ニッキ
- PHPでクラスを使うとき、コンストラクタ宣言は一つだけ!:ギジュツメモ
- 文字列から関数やクラスを得る:Rainy Day Codings
ある程度まとまった処理を別プログラムで再利用したり、複雑なデータ構造を扱う際、クラスを使うと効果がある。
今回は、入力したテキストの文字数をカウントし、見やすい文章かどうかを調べるプログラムを、クラスを使って組み立ててみることにする。