こうしろうのプログラミングはMindStormsの標準プログラムRIS1.0から始まった。小学校5年生のころである。英語で書かれたプログラムブロックを画面上で繋いでロボットを動かすプログラムを作っていくところからスタートし,C言語の似たNQC(Not Quiet C)でもMindStormsを動かしてみた。中学生になると,基本情報技術者試験のためにC言語を少し勉強し,私が日経ソフトウエア誌 2003年7月号から1年間連載した『C言語で始めるプログラミングの基礎』で勉強し直した。
高校生になってからは,Delphiでブラウザを作ったりもした。考えると,このMindstorms日記も,もう6年目に入る。
やっていないこと,教えていない重要なテーマはオブジェクト指向の概念というか考え方だ。現在,こうしろうが勉強しているPHPのオブジェクト指向はPHP4まではどちらかというと,後から取ってつけたようなものだった。しかし,新しいバージョンPHP5では,実行エンジンZend Engineが2.0になって大幅にバージョンアップしたことで,オブジェクト指向も本格的なものになった。このPHP5を使ってオブジェクト指向の基本をこうしろうに教えたいと思っている。
まずは改定新版「基礎PHP」WINGSプロジェクト著(インプレス発行)に載っているクラスのサンプルを入力していく。こうしろうがサンプルプログラムを入力している途中で「サンプルはPHP4までの書き方だけど,PHP5 の書き方に直してごらん」とPHP5ではプロパティ(メンバー変数)はvarではなく,public,protected,privateを使って宣言すること,PHP4まではクラスのインスタンス生成時に自動実行されるコンストラクタはクラスと同名の関数だったが,PHP5では__constructという名前(アンダーバー2個に続けてconstruct)に統一されたことなどを説明した。
---------------------------------------------------------- saifu = (int)$money; $this->who = $name; } function get_saifu(){ return $this->saifu; } function buy( $nedan ){ if($this->saifu < $nedan){ return FALSE; }else{ $this->saifu -= $nedan; return TRUE; } } function message( $shina ){ print( $this->who.":".$shina."-購入 <br>"); } } ?> ----------------------------------------------------------$saifu,$whoがプロパティ(メンバー変数)であり,get_saifuやbuyがメソッド(メンバー関数)である。クラスの中でメンバー変数を参照する場合は,$this->saifuのように記述する。このファイルをkaimono_class.phpという名前で保存した。次に,このクラスを使うプログラムを入力した。
---------------------------------------------------------- <http> <head> <title>otsukai.php</title> </head> <body> <?php require_once( "kaimono_class.php" ); define( KODUKAI, 800); define( NINJIN, 300); define( MOYASHI, 30); define( JAGAIMO, 200); print( "【母豚からのお小遣い】<br>"); print( KODUKAI."円<br>"); print( "【3匹の子豚】<br>"); $pigA = new kaimono_class(KODUKAI/3, "子豚A"); $pigB = new kaimono_class(KODUKAI/3, "子豚B"); $zankin = KODUKAI - $pigA->get_saifu() - $pigB->get_saifu(); $pigC = new kaimono_class($zankin, "子豚C"); if($pigA->buy( NINJIN )){ $pigA->message("にんじん"); $kago[] = "にんじん"; } if($pigB->buy( MOYASHI )){ $pigB->message("もやし"); $kago[] = "もやし"; } if($pigC->buy( JAGAIMO )){ $pigC->message("じゃがいも"); $kago[] = "じゃがいも"; } print("【買ったものリスト】<br>"); foreach( $kago as $value ){ print("$value"); } print("<br>おつり合計 <br>"); $otsuri = $pigA->get_saifu() + $pigB->get_saifu() + $pigC->get_saifu(); print( $otsuri."円"); ?> </body> ----------------------------------------------------------クラスファイルを利用するにはrequire_once( "kaimono_class.php" );としてプログラム中に読み込む。クラス定義はヒナ型を宣言するだけで,実際にクラスを使うには$pigA = new kaimono_class(KODUKAI/3, "子豚A");のようにnew演算子でインスタンス(実体)を作る必要がある。クラスのメンバー関数を呼び出すには$pigA->message("にんじん");のように記述する。
実行結果はこうなる(プログラム名はotsukai.php)。
ここまでは,単にクラスを使ってみただけなのでメリットは感じにくいが,プロパティ(変数)とメソッド(関数)をクラスに収められることをこうしろうは理解した(はずだ)。
次にPHP5から導入されたpublic,protected,privateなどのアクセス修飾子の使い方を説明した。$ saifuをpublicで宣言した場合,クラスの外でも$pigC->saifu += 1000;のようにアクセスすることができるが,private修飾子を付けて宣言し(1),
---------------------------------------------------------- saifu = (int)$money; $this->who = $name; } ~中略~ } ?> ----------------------------------------------------------クラスファイルを読み込んだotsukai.phpの中でアクセスしようとすると(2),
---------------------------------------------------------- saifu += 1000; ・・・(2) print("【買ったものリスト】<br>"); foreach( $kago as $value ){ print("$value"); } ~中略~ ?> ----------------------------------------------------------privateなプロパティにアクセスできないというエラーが表示される。
private修飾子を付けるクラスの中でしかプロパティにアクセスできないようになり,protectedを付けると宣言したクラスとそのクラスを継承したクラスでしかアクセスできないようになる。アクセス修飾子を使うことで,不用意なプロパティ値の変更を防ぐことができる。これがオブジェクト指向の重要な概念のひとつ,カプセル化である。