構造化とオブジェクト指向 (4/7)
作成:2010-12-11 20:55
更新:2010-12-11 21:24
更新:2010-12-11 21:24
■クラスを作ってみよう!
では、実際にクラスを作って、それを利用してみましょう。先ほどの「テキストの中からPHPというテキストだけ表示を変える」サンプルを更に修正し、もっと汎用的なクラスを作って、それを利用することにしましょう。
下にそのサンプルコードを掲載しておきます。ここでは、「TextModify」というクラスを作り、これを利用してヘッダー用、メッセージ用、そしてテキストの置換用のインスタンスを用意し、それぞれの機能を呼び出して表示を作成しています。
作成したTextModifyクラスを見ると、新たに登場したものがいくつか登場しています。それらを補足説明していきましょう。
1.アクセス・キーワード
ここでは、$header、$footer、$body、$findという4つのフィールドを用意しています。それぞれ置換テキストのヘッダー(前に付けるテキスト)、フッター(あとに付けるテキスト)、ボディ(対象となるテキスト本体)、そして検索文字を保管するものです。
これらのフィールドを見ると、前に「private」というものが付けられていますね。これは、このフィールドがどこまで利用できるかという利用範囲を指定するもので、「アクセス・キーワード」と呼ばれるものです。これには以下のようなものが用意されています。
private――このクラスの中からのみ使える。外部からは一切使えない。
protected――このクラスおよびそのサブクラスから使える。
public――クラス外からも使える。
この中で出てくる「サブクラス」というのは、オブジェクト指向の「継承」という機能を利用したものです。これについては改めて触れるとして、とりあえずここでは「privateにすればクラスの中だけでのみ使え、publicにすると外部からも自由に使える」とだけ覚えておくとよいでしょう。
こうしたフィールドは、オブジェクトの性質などを示す値が保管されていますから、外部から勝手に変更できてしまうと困ってしまいます。そこで、フィールドそのものはprivateにしておき、変更用のメソッドを別途用意して、外部からはそのメソッドを呼び出して値を操作するのが一般的です。
2.コンストラクタ
ここでは、「__construct」という変わった名前のpublicな(つまり外部から自由に使える)メソッドが作成されていますね。このメソッドは「コンストラクタ」と呼ばれるものです。これは、newでインスタンスを作成する際、自動的に呼び出されるメソッドで、インスタンスの初期化処理などを行います。これは、必要なければ省略してもかまいません。
このコンストラクタでは、2つの引数を用意していますね。これを用意することで、newする際に2つの引数を用意するようになります。実際、newしている部分を見てみると、
3.アクセサ・メソッド
クラスに用意されているメソッドの中には、フィールドを操作するものがいくつか用意されています。setHeader、setFooter、setBody、setFindといったものです。
先に触れたように、フィールドは、privateにしておき、その値を取り出したり変更したりするメソッドを別に用意しておくのが一般的です。こうしたメソッドを「アクセサ」といいます。
アクセサは、一般に「getフィールド名」「setフィールド名」といった名前で用意します。まぁ、これはそうしないといけないというわけではありませんが、こうしたルールに従って名前をつけたほうがわかりやすくなります。
4.$thisについて
メソッドでは、「自分自身」について操作を行うことがよくあります。通常、クラスはインスタンスを作って利用しますが、この「今、使っているこのインスタンス自身の中にあるフィールドやメソッド」を利用する場合、どうすればいいのでしょうか。
こうしたときに用いられるのが「$this」という変数です。これは、「このインスタンス自身」を示す変数なのです。これを利用することで、自分自身の機能を呼び出すことができます。
――とりあえず、これらの点をよく頭にいれて、コードを読んでみましょう。どういう具合にクラスとインスタンスが動いているのか、なんとなくわかってくるはずです。
下にそのサンプルコードを掲載しておきます。ここでは、「TextModify」というクラスを作り、これを利用してヘッダー用、メッセージ用、そしてテキストの置換用のインスタンスを用意し、それぞれの機能を呼び出して表示を作成しています。
作成したTextModifyクラスを見ると、新たに登場したものがいくつか登場しています。それらを補足説明していきましょう。
1.アクセス・キーワード
ここでは、$header、$footer、$body、$findという4つのフィールドを用意しています。それぞれ置換テキストのヘッダー(前に付けるテキスト)、フッター(あとに付けるテキスト)、ボディ(対象となるテキスト本体)、そして検索文字を保管するものです。
これらのフィールドを見ると、前に「private」というものが付けられていますね。これは、このフィールドがどこまで利用できるかという利用範囲を指定するもので、「アクセス・キーワード」と呼ばれるものです。これには以下のようなものが用意されています。
private――このクラスの中からのみ使える。外部からは一切使えない。
protected――このクラスおよびそのサブクラスから使える。
public――クラス外からも使える。
この中で出てくる「サブクラス」というのは、オブジェクト指向の「継承」という機能を利用したものです。これについては改めて触れるとして、とりあえずここでは「privateにすればクラスの中だけでのみ使え、publicにすると外部からも自由に使える」とだけ覚えておくとよいでしょう。
こうしたフィールドは、オブジェクトの性質などを示す値が保管されていますから、外部から勝手に変更できてしまうと困ってしまいます。そこで、フィールドそのものはprivateにしておき、変更用のメソッドを別途用意して、外部からはそのメソッドを呼び出して値を操作するのが一般的です。
2.コンストラクタ
ここでは、「__construct」という変わった名前のpublicな(つまり外部から自由に使える)メソッドが作成されていますね。このメソッドは「コンストラクタ」と呼ばれるものです。これは、newでインスタンスを作成する際、自動的に呼び出されるメソッドで、インスタンスの初期化処理などを行います。これは、必要なければ省略してもかまいません。
このコンストラクタでは、2つの引数を用意していますね。これを用意することで、newする際に2つの引数を用意するようになります。実際、newしている部分を見てみると、
$rep_obj = new TextModify("<b>","</b>");こんな具合に、ヘッダーとフッターを引数に指定してnewしていることがわかります。
3.アクセサ・メソッド
クラスに用意されているメソッドの中には、フィールドを操作するものがいくつか用意されています。setHeader、setFooter、setBody、setFindといったものです。
先に触れたように、フィールドは、privateにしておき、その値を取り出したり変更したりするメソッドを別に用意しておくのが一般的です。こうしたメソッドを「アクセサ」といいます。
アクセサは、一般に「getフィールド名」「setフィールド名」といった名前で用意します。まぁ、これはそうしないといけないというわけではありませんが、こうしたルールに従って名前をつけたほうがわかりやすくなります。
4.$thisについて
メソッドでは、「自分自身」について操作を行うことがよくあります。通常、クラスはインスタンスを作って利用しますが、この「今、使っているこのインスタンス自身の中にあるフィールドやメソッド」を利用する場合、どうすればいいのでしょうか。
こうしたときに用いられるのが「$this」という変数です。これは、「このインスタンス自身」を示す変数なのです。これを利用することで、自分自身の機能を呼び出すことができます。
――とりあえず、これらの点をよく頭にいれて、コードを読んでみましょう。どういう具合にクラスとインスタンスが動いているのか、なんとなくわかってくるはずです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
<?php class TextModify { private $header = "<b>"; private $footer = "</b>"; private $body = ""; private $find = "PHP"; public function __construct($h,$f){ $this->setHeader($h); $this->setFooter($f); } function setHeader($s){ $this->header = $s; } function setFooter($s){ $this->footer = $s; } function setBody($s){ $this->body = htmlspecialchars(strtoupper($s)); } function setFind($s){ $this->find = $s; } function getRenderText(){ $res = str_replace($this->find, $this->header . $this->find . $this->footer, $this->body); return $res; } function writeRenderText(){ echo $this->getRenderText(); } } // インスタンスの準備 $title_obj = new TextModify('<span style="color:red;">','</span>'); $title_obj->setFind("PHP"); $title_obj->setBody('Hello PHP!'); $msg_obj = new TextModify('<span style="color:blue;">','</span>'); $msg_obj->setBody('ここに、PHPという文字を含む文章を書いて下さい。'); $rep_obj = new TextModify("<b>","</b>"); if ($_POST != null){ $str = $_POST['text1']; $rep_obj->setBody($str); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>sample page</title> </head> <body> <h1><?php $title_obj->writeRenderText(); ?></h1> <p><?php $msg_obj->writeRenderText(); ?></p> <hr> <p><?php $rep_obj->writeRenderText(); ?></p> <form method="post" action="./index.php"> <textarea name="text1" cols="40" rows="5"><?php echo $str; ?></textarea> <br><input type="submit"> </form> <hr> </body> </html>
※関連コンテンツ