12月5日 この日は継承(インヘリタンス)からはじめる。継承とはすでに定義されているクラスの機能を受け継いで,拡張や変更を加え新しいクラスを定義することである。既存のクラスのプロパティやメソッドをそのまま使え,自分が必要なメソッドを追加したり,書き換えたりすることができるので継承を使うとプログラミングの効率が上がる。前回説明したアクセス修飾子によるカプセル化とともに,オブジェクト指向プログラミングの基本の一つである。また,メソッドのオーバーライド(上書き)やアクセス修飾子の変更によってクラスの振る舞いを変えることができる。

 もとになるクラスをスーパークラス,あるいは基底クラス,基本クラス,親クラスなどと呼び,新たに定義されたクラスをサブクラス,あるいは派生クラス,子クラスと言う。呼び方が数種類あるのは言語によって呼び方が違ったりするせいだ。

 あまり難しくとらえず,継承は差分だけプログラミングすれば良いようにするテクニックであると考えると気軽だ。

 さて,この日もこうしろうは改定新版「基礎PHP」のサンプルプログラムを入力し,PHPの勉強を始める。

----------------------------------------------------------

 require_once("kaimono_class.php");
 class kaimono2_class extends kaimono_class {

----------------------------------------------------------
 kaimono_classを継承して子クラスkaimono2_classを宣言するコードである。親クラスのkaimono_classはkaimono_class.phpの中で宣言してあるのでrequire_once命令で取り込んでいる。

 プロパティ(メンバー変数)を追加したり,メソッド(メンバー関数)を追加できることを確認した。小学生のころスポーツ少年団の野球部に入っていたこうしろうは,高校生になった今も,いつも返事は良い。何か説明すると「はい」と答える。しかし,この「はい」にだまされてはいけない。どうも顔を見ていると,ピンときているようには見えない。

 「もっと,じっくりやろうか」とBeginning「PHP5」という分厚い洋書を取り出した。

 英語を読むのは辛いのだが,和書にPHP5のオブジェクト指向をじっくり解説した本が少ないので,PHP5がリリースされたときに,自分が勉強するために買った洋書をテキスト代わりに使うことにした。入門者向けの本なので特にオブジェクト指向に特化しているわけではないのだが,なにしろ総ページ数が850ぐらいあるので,おのずとオブジェクト指向について解説したページも多くなっているのだ。

 英文の解説文をじっくり読んでいると,とても時間が掛かるので知らない単語は読み飛ばし,「こんなことを説明しているんだ」と概略だけをつかんでいく。 (class.Demo.php)
----------------------------------------------------------

<?php
  class Demo {
    private $_name;
    public function sayHello() {
      print "Hello {$this->getName()}!";
    }
    public function getName() {
       return $this->_name;
    }
    public function setName($name) {
      if(!is_string($name) || strlen($name) == 0) {
        throw new Exception('Invalid name value');
      }
      $this->_name=$name;
    }
  }
?>

----------------------------------------------------------
 やはり,どんな解説書でもオブジェクト指向の解説はカプセル化から始まるようだ。上記のDemoクラスにはprivateなメンバー変数(プロパティ)$_nameが宣言されている。アクセス修飾子privateで制限をかけたプロパティはクラスの外から更新,参照することはできないので,publicなメンバー変数(メソッド)setNameで$_nameに名前をセット,同じくpublicなメソッドgetNameで参照できるようにしている。

 逆にメソッドにprivate修飾子を付けると,クラスの中でしか使うことができなくなる。また,PHP5ではthrow new Exceptionで例外を投げることができるようになっている。
----------------------------------------------------------

<?php
  require_once('class.Demo.php');
  $objDemo = new Demo;
  $objDemo->setName('Steve');
  $objDemo->sayHello();
?>

----------------------------------------------------------
 クラスを使う側では,require_onceでクラス定義を読み込み,new演算子でインスタンス(実体)を作り,$objDemo-> setName('Steve');のようにオブジェクトのメソッドを実行する。