今まではオブジェクト指向プログラミングの基礎の部分を学んできましたが、ここからは応用といいますか使い所について学習していきます。手始めにクラスの継承について見ていきましょう。
スーパークラスとサブクラス
既存のクラスのプロパティやメソッドなどのメンバーを引き継いで新たなクラスを作成することをクラスの継承と呼びます。
継承元のクラスをスーパクラス、スーパークラスを継承して作成されたクラスをサブクラスといいます。引き継いでクラスを使うならそのままコードをコピペして使えばいいのでは?と思う人もいるかと思いますが、新たにどんどんクラスを追加していけば元の機能と追加された機能の使い分けに困りますし、巨大化していき使いづらくなってしまいます。
また、余分な部分が増えて無駄に肥大化しますし、修正する場合に書き換える箇所が増えて修正ミスが起きる可能性も多くなるなどデメリットがあります。
クラスを継承する方法
では、スーパークラスとサブクラスを作成してみましょう。
まずは値を加算するメソッドを持つスーパークラスを作成します。
<?php
class AddNum{
protected $num;//継承先クラスで参照できるようにするためprotectedにする
public function add($num){
$this->num += $num;
}
public function getNum(){
return $this->num;
}
}
?>
次にサブクラスを作成しましょう。
<?php
require_once 'AddNum.php';//スーパークラスのファイルを読み込む
class AddNumSub extends AddNum{ //extends クラス名で継承する
private $rec;
public function recorder(){
$this->rec = $this->num;
}
public function getRec(){
return $this->rec;
}
}
?>
スーパークラスとサブクラスを定義しましたね。サブクラスをインスタンス化して使ってみます。
<html>
<head>
<meta charset="utf-8">
<title>カプセル化</title>
</head>
<body>
<?php
require_once 'AddNumSub.php';
$num = new AddNumSub();//インスタンス化
$num->add(10);//スーパークラスのメソッドを呼び出す
$num->recorder();//サブクラスのメソッド
$num->add(20);//スーパークラスのメソッド
print "num = ". $num->getNum()."<br>";
print "recorder = ". $num->getRec()."<br>";
?>
</body>
</html>
ページを表示させるとスーパークラスのプロパティ値とサブクラスのプロパティ値が出力されましたね。このようにスーパークラスを継承させておくことにより、サブクラスを読み込んでインスタンス化するとスーパークラスのメソッドやプロパティを扱うことができます。
サブクラスの多重継承禁止
C++のようなプログラミング言語の中に2つ以上のクラスを継承することができますが、PHPでは1つのクラスしか継承することができません。これはプログラムの中で不要なトラブルが起きないようにしているためです。
コメント