18. クラスについて - 続き
今日は、クラスについての続きをご説明いたします。
■クラスの継承
前回は、クラスの基本的なことをお話しましたが、今回はクラスの継承についてを
ご紹介いたします。
一度作成したクラスは、クラスを継承して機能を拡張していくことで、さらに威力を
発揮します。
継承されるクラスを親クラス、継承したクラスを子クラスなどと呼びます。もちろん
一つの親クラスに、複数の子クラスを継承させることも可能です。
子クラスは、親クラスのメンバ変数やメンバ関数をそのまま使用できます。さらに、
子クラスにメンバ変数やメンバ関数を追加していくことができます。
例えば、データベースに接続する親クラスを作成し、さらにその子クラスとして、
そのデータベースのテーブルを取得、更新する子クラスを複数作成するなどという
使用方法が考えられます。
クラスの継承を行うには、子クラスのファイル内で親クラスパッケージを呼び出し、
子クラスのコンストラクタ内で、親クラスのコンストラクタを呼び出します。
-----------------------------------------------------------------
// 子クラス
class child extends parent {
// メンバ変数
var $member_b;
//--------------------------------------------------------
// 関数 : child
// 概要 : メンバ変数の初期値を設定(コンストラクタ)
// 引数 : member_aの値
// 戻値 : なし
//--------------------------------------------------------
function child() {
$this->parent();
$this->member_b = "Child member_b";
}
//------------------------------------------------------------------
// 関数 : print_child
// 概要 : メンバ変数の出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_child() {
print $this->member_a;
print $this->member_b;
}
}
//親クラス
class parent {
// メンバ変数
var $member_a;
//--------------------------------------------------------
// 関数 : parent
// 概要 : メンバ変数の初期値を設定(コンストラクタ)
// 引数 : member_aの値
// 戻値 : なし
//--------------------------------------------------------
function parent() {
$this->member_a = "Parent member_a";
}
//------------------------------------------------------------------
// 関数 : print_parent
// 概要 : メンバ変数の出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_parent() {
print $this->member_a;
}
}
-----------------------------------------------------------------
ここでは、親クラスとしてparentクラス、子クラスとしてchildクラスをそれぞれ
定義しています。
親クラスを継承したクラスを作成するには、クラス宣言部分で、
class (子クラス名) extends (親クラス名)
とします。
また、親クラスのコンストラクタを呼ぶ場合、
$this->コンストラクタ名();
とすれば良いです。
parentクラスにmember_aというメンバ変数を定義していますが、子クラス側でも
print_child内で、自分のメンバと同様に呼び出し方で呼び出しているのが分かる
かと思います。
■クラスの呼び出し
クラスの呼び出しですが、子クラスが親クラスを継承している場合、子クラスのみを
オブジェクト化すれば、親クラスの機能を使用できます。
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// クラスファイルの読み込み
require "common.php";
// クラスのオブジェクト化
$cmn =& new child();
// 子クラスのメンバ関数を呼ぶ
$cmn->print_child();
// 親クラスのメンバ関数を呼ぶ
$cmn->print_parent();
?>
</BODY>
</HTML>
-----------------------------------------------------------------
子クラスのメンバ関数(print_child)を呼び出すと、親クラスのメンバ変数と
子クラスのメンバ変数が表示されると思います。
子クラスのオブジェクトから直接、親クラスのメンバ関数(print_parent)を
呼び出すこともできます。
★今日のまとめサンプルプログラム
common.php
-----------------------------------------------------------------
<?
// 子クラス
class child extends parent {
// メンバ変数
var $member_b;
//--------------------------------------------------------
// 関数 : child
// 概要 : メンバ変数の初期値を設定(コンストラクタ)
// 引数 : なし
// 戻値 : なし
//--------------------------------------------------------
function child() {
$this->parent();
$this->member_b = "Child member_b";
}
//------------------------------------------------------------------
// 関数 : print_a
// 概要 : メンバ変数の出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_a() {
print $this->member_a;
}
//------------------------------------------------------------------
// 関数 : print_b
// 概要 : メンバ変数の出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_b() {
print $this->member_b;
}
}
//親クラス
class parent {
// メンバ変数
var $member_a;
//--------------------------------------------------------
// 関数 : parent
// 概要 : メンバ変数の初期値を設定(コンストラクタ)
// 引数 : なし
// 戻値 : なし
//--------------------------------------------------------
function parent() {
$this->member_a = "Parent member_a";
}
//------------------------------------------------------------------
// 関数 : set_a
// 概要 : メンバ変数の設定
// 引数 : member_aに設定する値
// 戻値 : なし
//------------------------------------------------------------------
function set_a($a) {
$this->member_a = $a;
}
//------------------------------------------------------------------
// 関数 : get_a
// 概要 : メンバ変数の取得
// 引数 : なし
// 戻値 : member_a
//------------------------------------------------------------------
function get_a() {
return $this->member_a;
}
}
?>
-----------------------------------------------------------------
index.php
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// クラスファイルの読み込み
require "common.php";
// クラスのオブジェクト化
$cmn =& new child();
// 子クラスのメンバ関数を呼ぶ
$cmn->print_a();
print "<br>\n";
$cmn->print_b();
print "<br>\n";
// 親クラスのメンバ関数を使用
$cmn->set_a("TEST");
// 親クラスのメンバ関数を呼ぶ
print $cmn->get_a() . "<br>\n";
// 子クラスのメンバ変数を直接変更
$cmn->member_b = "test";
// 子クラスのメンバ変数を直接使用
print $cmn->member_b . "<br>\n";
?>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
少し分かりづらいかもしれませんが、親クラスでmember_aを持たせ、これを設定する
set_aと取得するget_aを作成し、子クラスで、member_bを持たせて、member_aと
member_bを出力するprint_aとprint_bを作成しています。
親クラスを継承した子クラスを使用する場合、親クラスの変数・関数なのかを意識
することなく、同じクラスの変数・関数として扱えるので、大変便利です。
★課題
1. まとめサンプルを、以下の条件で改変してください。
(1) member_cというメンバ変数をparentクラスに追加し、初期値に現在日時
(yyyy/mm/dd hh:mm:ss)を格納してください。
(2) member_cを出力するprint_cを子クラスのchildクラスに追加してください。
(3) member_cに値を設定するset_cというメンバ関数を、親クラスparnetに追加して
ください。
(4) 現在日時(yyyy/mm/dd hh:mm:ss)をmember_cに設定するupdate_cという関数を、
子クラスchildに追加してください。
★前回の課題の解答
1. まとめサンプルを、以下の条件で改変してください。
(1) member_bを出力するprint_bというメンバ関数を追加してください。
(2) member_aを取得するget_aというメンバ関数を追加してください。
(3) member_cというメンバ変数を追加し、初期値に現在日時(yyyy/mm/dd hh:mm:ss)を
格納してください。
(4) member_cに値を設定するset_cというメンバ関数を追加してください。
→下のサンプルを参照してください。
common.php
-----------------------------------------------------------------
<?
class common {
// メンバ変数
var $member_a;
var $member_b;
var $member_c;
//--------------------------------------------------------
// 関数 : common
// 概要 : メンバ変数の初期値を設定(コンストラクタ)
// 引数 : member_aの値
// 戻値 : なし
//--------------------------------------------------------
function common($a, $b) {
$this->member_a = $a;
$this->member_b = $b;
$this->member_c = date("Y/m/d H:i:s");
}
//------------------------------------------------------------------
// 関数 : print_a
// 概要 : メンバ変数member_aの出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_a() {
print $this->member_a;
}
//------------------------------------------------------------------
// 関数 : print_b
// 概要 : メンバ変数member_bの出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_b() {
print $this->member_b;
}
//------------------------------------------------------------------
// 関数 : get_a
// 概要 : メンバ変数member_aの取得
// 引数 : なし
// 戻値 : member_a
//------------------------------------------------------------------
function get_a() {
return $this->member_a;
}
//------------------------------------------------------------------
// 関数 : get_b
// 概要 : メンバ変数member_bの取得
// 引数 : なし
// 戻値 : member_b
//------------------------------------------------------------------
function get_b() {
return $this->member_b;
}
//------------------------------------------------------------------
// 関数 : set_a
// 概要 : メンバ変数member_aの設定
// 引数 : 設定するmember_aの値
// 戻値 : なし
//------------------------------------------------------------------
function set_a($a) {
$this->member_a = $a;
}
//------------------------------------------------------------------
// 関数 : set_c
// 概要 : メンバ変数member_cの設定
// 引数 : 設定するmember_cの値
// 戻値 : なし
//------------------------------------------------------------------
function set_c($c) {
$this->member_c = $c;
}
}
?>
-----------------------------------------------------------------
index.php
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// クラスファイルの読み込み
require "common.php";
// クラスのオブジェクト化
$cmn =& new common("Test", "Sample");
// (1) member_bを出力するprint_bというメンバ関数を追加してください。
$cmn->print_b();
print "<br>\n";
// (2) member_aを取得するget_aというメンバ関数を追加してください。
print $cmn->get_a() . "<br>\n";
// (3) member_cというメンバ変数を追加し、初期値に現在日時(yyyy/mm/dd hh:mm:ss)を
// 格納してください。
print $cmn->member_c . "<br>\n";
// (4) member_cに値を設定するset_cというメンバ関数を追加してください。
$cmn->set_c("2005/03/01 00:00:00");
print $cmn->member_c . "<br>\n";
?>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
サンプルのメンバ関数を参考に、コピーして使用すればできるかと思います。
|