クラスの継承
クラスは継承することができます。「継承」とは文字通り、「元の情報を受け継ぐこと」です。すでに存在するクラスの情報をそのまま使って、さらに拡張して新たなクラスを作ることを「クラスの継承」といいます。
・継承によるクラス作成
前回hitoクラスを作りました。hitoクラスにはnamaeとsintyoのプロパティ、そしてhyozyunというメソッドがありました。
これらをそのまま利用して、さらに別のプロパティとメソッドを追加した新たなクラス、hito2を作ってみることにします。
クラスを継承する場合、次のように記述します。
クラスの継承
書式
class 新たなクラス extends 継承する元のクラス名{
プロパティやメソッドの定義
}
たとえば、元となるhitoクラスを継承して新たなhito2クラスを作るときは次のようになります。
class hito2 extends hito{
....
}
新たなクラスhito2は、次のプロパティを追加することにします。
public $taizyu;
これはkg単位の体重用のプロパティです。
function bmi(){
$s2 = $this->sintyo/100;
return $this->taizyu/($s2*$s2);
}
「BMI値=体重(kg)÷(身長(m)✕身長(m))」で計算できます。
「$this->sintyo」はhitoクラスのプロパティなので、拡張したhito2クラスでもそのまま使えます。これ($this->sintyo)を100で割ったm単位の身長を$s2に代入。
体重($this->taizyu)をm単位の身長($s2)の二乗で割ってBMIを返すメソッドです。
ついでにもう一つBMI値から肥満度のメッセージを表示するメソッドhimanも追加します。
function himan(){
$b = $this->bmi();
if ($b>= 40){
print"肥満度4";
}elseif ($b>=35){
print"肥満度3";
}elseif($b>=30){
print"肥満度2";
}elseif($b>=25){
print"肥満度1";
}elseif($b>=18.5){
print"普通体重";
}else{
print"低体重";
}
}
先程説明した、BMI値を返すメソッドbmi()の値($this->bmi())を変数$bに代入。if文による分岐で、この値($bつまりBMI値)に対応したメッセージが表示されます。
■継承したクラスの利用
では、継承したクラスを利用してみることにしましょう。
hitoクラスを継承したhito2クラスでは、新しく定義したメソッドやプロパティに加え、hitoクラスで定義したメソッドやプロパティも使うことができます。
まず、hito2のオブジェクトを作り、プロパティに値を代入します。
$obj = new hito2();
$obj->namae ="西沢";
$obj->sintyo=175;
$obj->taizyu=80;
そして次を表示します。
標準体重 :$obj->hyozyun();
体重 :$obj->taizyu;
肥満度の判定 :$obj->himan();
まとめてみると次のようになります。
<?php
$obj = new hito2();
$obj->namae = "西沢";
$obj->sintyo=175;
$obj->taizyu=80;
print $obj->namae."さんの健康チェック<br>";
print "標準体重は".$obj->hyozyun()."<br>";
print "体重は".$obj->taizyu."<br>";
print "BMIは".$obj->bmi()."<br>";
print $obj->himan();
//hitoクラスの定義
class hito{
public $namae;
public $sintyo;
function hyozyun(){
$s = $this->sintyo/100;
return $s*$s*22;
}
}
//hito2クラスの定義
class hito2 extends hito{
public $taizyu;
function bmi(){
$s2 = $this->sintyo/100;
return $this->taizyu/($s2*$s2);
}
function himan(){
$b = $this->bmi();
if($b>=40){
print"肥満度4";
}elseif($b>=35){
print"肥満度3";
}elseif($b>=30){
print"肥満度2";
}elseif($b>=25){
print"肥満度1";
}elseif($b>=18.5){
print"普通体重";
}else{
print"低体重";
}
}
}
?>
実行結果
hitoクラスで使用していたプロパティnamaeとsintyo,そしてメソッドhyozyun()を、
hito2クラスでもそのまま利用することができました。