PHP入門 | 構造化とオブジェクト指向 | クラスを作ってみよう

それでは実際にクラスを作り、それを利用してみよう。以前の「テキストの中でPHPという文字だけ表示を変える」例をさらに修正し、もう少し汎用的なクラスを作って利用することにする。

次のように例のコードを書く。

<?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>
<html lang="ko">
    <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>

ここでは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. アクセスメソッド

クラスで提供されるメソッドの中には、フィールドを操作するものがいくつか用意されている。setHeadersetFootersetBodysetFindである。

前述したように、フィールドはprivateにしておき、その値を取得したり変更したりするメソッドを別に用意するのが一般的である。このようなメソッドを「アクセサ」と呼ぶ。

アクセサは一般的にgetフィールド名setフィールド名という名前で宣言する。そうしなければならないわけではないが、この規則に従って名前を付けるほうがわかりやすい。

4. $thisについて

メソッドは「自分自身」に対して処理を行うことが多い。一般的にクラスはインスタンスを作って使うが、「今使っているこのインスタンス自身の中にあるフィールドやメソッド」を利用する場合はどうすればよいだろうか。

このような場合に使われるのが$thisという変数である。これは「このインスタンス自身」を表す変数である。これを利用して、自分自身の機能を呼び出せる。

 

まずはこうした内容を踏まえてコードを見てみよう。クラスとインスタンスがどのように動作しているかがわかるはずである。