構造化とオブジェクト指向 (6/7)
作成:2010-12-12 12:47
更新:2010-12-12 12:47
更新:2010-12-12 12:47
■クラスメソッドとクラスフィールド
ここまでは、「クラスはインスタンスを作って操作する」のが基本だ、と説明してきました。が、実をいえば、クラスをクラスのまま利用することもできないわけではありません。ただし、そのためにはメソッドやフィールドを違う形で用意してやらないといけません。
インスタンスではなく、クラスから直接利用できるメソッドやフィールドは「クラスメソッド」「クラスフィールド」と呼ばれます。クラスを単なる設計図と考えると、なんでクラスの中に値を保管したりメソッドを実行したりできるのかちょっと不思議な感じがしますが、「クラスもオブジェクトで、クラスというオブジェクトを元にインスタンスというオブジェクトを作っている」と想像するとよいでしょう。
クラスに用意するメソッドやフィールドは、冒頭に「static」というキーワードを付けます。これは「静的な」という意味で、クラスメソッドやクラスフィールドは、「staticメソッド」「staticフィールド」とも呼ばれます。
では、これらの基本的な使い方を簡単に整理しておきましょう。まずこれらの定義ですが、
では、これも実際にサンプルを挙げておきましょう。下のリストは、先のサンプルのTextModifyクラスを、クラスメソッドとクラスフィールドを利用する形に書きなおしたものです。ここでは、PHPというテキストを2倍のフォントサイズで表示するようにしてみました。
この例では、setTagDataで挟みこむ前後のタグを設定し、setFindで検索文字を設定しています。
クラスメソッドとクラスフィールドを使うと、インスタンスを作らないで済むため、このように非常にシンプルに機能を呼び出せるようになります。反面、さまざまなデータを保持してそれに基づいて動作するようなものは、利用するたびにたくさんのデータを再設定しなければならないため非常に面倒になります。
多くのデータを保持し、それに応じて処理を行うようなものは、インスタンスを作って利用するほうがはるかに便利でしょう。クラスメソッドは、変更することがほとんどないデータしかないような場合で、単純に決まった機能を呼び出すだけ、というときに使うとよいでしょう。
例えば数値演算(引数で数字を渡すと答えが返るようなもの)などをクラスにまとめて使う、というようなときには、いちいちインスタンスを作るより、クラスメソッドとしてスパッと呼び出せたほうが便利です。用途に応じて使い分けるのがよいでしょう。
インスタンスではなく、クラスから直接利用できるメソッドやフィールドは「クラスメソッド」「クラスフィールド」と呼ばれます。クラスを単なる設計図と考えると、なんでクラスの中に値を保管したりメソッドを実行したりできるのかちょっと不思議な感じがしますが、「クラスもオブジェクトで、クラスというオブジェクトを元にインスタンスというオブジェクトを作っている」と想像するとよいでしょう。
クラスに用意するメソッドやフィールドは、冒頭に「static」というキーワードを付けます。これは「静的な」という意味で、クラスメソッドやクラスフィールドは、「staticメソッド」「staticフィールド」とも呼ばれます。
では、これらの基本的な使い方を簡単に整理しておきましょう。まずこれらの定義ですが、
static $変数;このように、冒頭にstaticを付けるだけです。アクセス・キーワードを付ける場合は、staticの後に「static private $hoge;」という具合に書きます。これらのフィールドやメソッドの呼び出しは、
static function メソッド ( 仮引数 ){……}
クラス::$変数;このように記述します。クラス名の後に、::という記号をつけて記述します。注意したいのは、フィールドです。インスタンスフィールドは、○○->○○というように記述しますが、クラスフィールドの場合は、○○::$○○というように、$をつけて記述する必要があります。
クラス::メソッド ( 引数 );
では、これも実際にサンプルを挙げておきましょう。下のリストは、先のサンプルのTextModifyクラスを、クラスメソッドとクラスフィールドを利用する形に書きなおしたものです。ここでは、PHPというテキストを2倍のフォントサイズで表示するようにしてみました。
この例では、setTagDataで挟みこむ前後のタグを設定し、setFindで検索文字を設定しています。
TextModify::setTagData('<span style="font-size:200%;">','</span>');newでインスタンスを作ることもなく、いきなりクラスに値を設定していますね。そして実際にテキストを出力させるときには、
TextModify::setFInd('PHP');
TextModify::writeRenderText('Hello PHP!');こんな具合に、ただメソッドを呼び出すだけです。非常にシンプルな使い方になりました。
クラスメソッドとクラスフィールドを使うと、インスタンスを作らないで済むため、このように非常にシンプルに機能を呼び出せるようになります。反面、さまざまなデータを保持してそれに基づいて動作するようなものは、利用するたびにたくさんのデータを再設定しなければならないため非常に面倒になります。
多くのデータを保持し、それに応じて処理を行うようなものは、インスタンスを作って利用するほうがはるかに便利でしょう。クラスメソッドは、変更することがほとんどないデータしかないような場合で、単純に決まった機能を呼び出すだけ、というときに使うとよいでしょう。
例えば数値演算(引数で数字を渡すと答えが返るようなもの)などをクラスにまとめて使う、というようなときには、いちいちインスタンスを作るより、クラスメソッドとしてスパッと呼び出せたほうが便利です。用途に応じて使い分けるのがよいでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
<?php class TextModify { static private $header = "<b>"; static private $footer = "</b>"; static private $find = "PHP"; static function setTagData($h,$f){ self::$header = $h; self::$footer = $f; } static function setFind($f){ self::$find = $f; } static function writeRenderText($s){ $res = str_replace(self::$find, self::$header . self::$find . self::$footer, $s); echo $res; } } // クラスの準備 TextModify::setTagData('<span style="font-size:200%;">','</span>'); TextModify::setFInd('PHP'); if ($_POST != null){ $str = $_POST['text1']; } ?> <!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 TextModify::writeRenderText('Hello PHP!'); ?> </h1> <p><?php TextModify::writeRenderText('ここに、PHPという文字を含む文章を書いて下さい。'); ?></p> <hr> <p><?php TextModify::writeRenderText($str); ?></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>
※関連コンテンツ