17. クラスについて
今日は、クラスについてご説明いたします。
■クラスの概念
クラスについての説明は、オブジェクト指向なども説明しなければならないの
ですが、これにについては、ちゃんと説明すると本1冊以上にもなるので、
ここでは簡単にご説明します。
クラスとは、一言で言うと、変数や関数を一まとまりにしたものです。
さらに、作成したクラスを継承して、新たにクラスを作り、拡張していく
ことができます。
クラスは、変数や関数を自由に持たせることができるので、例えば、出力する
関数をまとめてクラス化したり、データベースに接続するための変数や関数を
まとめてクラス化することができます。
基本的に、クラスは再利用をするために作成するもので、再利用が難しい場合は
クラス化する意味はないと言えます。クラスを作成する際には、どのような
クラスを作成すれば効率が良いかを、きちんと設計する必要があります。
■クラスの作成
説明はこの辺にしておいて、クラスのサンプルを以下に記述します。
-----------------------------------------------------------------
class class_common {
// メンバ変数
var $member_a;
var $member_b;
//--------------------------------------------------------
// 関数 : class_common
// 概要 : メンバ変数の初期値を設定(コンストラクタ)
// 引数 : member_aの値
// 戻値 : なし
//--------------------------------------------------------
function class_common($a = 0) {
$this->member_a = $a;
$this->member_b = "This is a test.";
}
//------------------------------------------------------------------
// 関数 : print_test
// 概要 : メンバ変数の出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_test() {
if ($this->member_a) {
print $this->member_b;
}
}
}
-----------------------------------------------------------------
クラスの中に定義した変数をメンバ変数、クラスの中で定義した関数をメンバ関数と
呼びます。
まず、コンストラクタという、特殊な関数をご説明します。
コンストラクタとは、呼び出し側でクラスを使用する時に、必ず呼び出す関数で、
通常、メンバ変数の初期化などが行われます。
コンストラクタ名は、クラス名と同じにします。引数に、"="で値を代入しておくと、
初期値になり、呼び出し側で引数を書かなかった場合は、この値が入ります。
これは、普通の関数でも同じです。ただし、複数の引数がある場合で、右の引数に
初期値を書かなかった場合は、左の引数の初期値を設定することはできません。
サンプルでは、コンストラクタ内でメンバ変数を初期化しています。
member_aにはコンストラクタの第一引数を設定しています。
メンバ変数やメンバ関数を扱う場合は、サンプルのように、$this->と書く必要が
あります。これは、明示的にこのクラスのメンバ変数またはメンバ関数を使用する
という意味になります。
クラス内に関数を書く場合は、サンプルのように、普通の関数を書く要領で記述
できます。
print_test関数では、メンバ変数の判定、出力を行っています。
また、クラスが破棄された時に呼ばれるデストラクタというものもありますが、
省略可能ですので、ここでは省略します。
■クラスの呼び出し
さて、次に呼び出し側ですが、まずは呼び出し側のサンプルを以下に記述します。
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// クラスファイルの読み込み
require "class_common.php";
// クラスのオブジェクト化
$cmn =& new class_common(1);
// member_aを出力
print $cmn->member_a;
// print_testを呼ぶ
$cmn->print_test();
?>
</BODY>
</HTML>
-----------------------------------------------------------------
まず、requireで、クラスを定義したファイルを呼び出します。同じファイル内に
クラスを定義している場合は、必要ありません。
次に、newでコンストラクタを呼び、class_commonのオブジェクトを作成します。
一度オブジェクト化したら、メンバ変数やメンバ関数を呼び出すことができます。
"->"という矢印のような形式で呼び出します。
オブジェクトは、いくつも作成することができます。
クラスの最大の長所は、クラスが別のクラスを継承できるという点です。
これについては、次回にご説明したいと思います。
★今日のまとめサンプルプログラム
class_common.php
-----------------------------------------------------------------
<?
class class_common {
// メンバ変数
var $member_a;
var $member_b;
//--------------------------------------------------------
// 関数 : class_common
// 概要 : メンバ変数の初期値を設定(コンストラクタ)
// 引数 : member_aの値
// 戻値 : なし
//--------------------------------------------------------
function class_common($a, $b) {
$this->member_a = $a;
$this->member_b = $b;
}
//------------------------------------------------------------------
// 関数 : print_a
// 概要 : メンバ変数member_aの出力
// 引数 : なし
// 戻値 : なし
//------------------------------------------------------------------
function print_a() {
print $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;
}
}
?>
-----------------------------------------------------------------
index.php
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// クラスファイルの読み込み
require "class_common.php";
// クラスのオブジェクト化
$cmn =& new class_common("Test", "Sample");
// member_aに新しい値を設定
$cmn->set_a("This is a ");
// print_aを呼ぶ
$cmn->print_a();
print "<br>\n";
// member_bを直接変更
$cmn->member_b = "test";
// member_bを取得して出力
print $cmn->get_b();
print "<br>\n";
?>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
クラスを定義したファイルは、別ファイルとして保存してください。
このサンプルでは、コンストラクタのnew()でメンバ変数に値を設定し、
さらにset_aでメンバ変数の値を変更、print_aでメンバ変数member_aを出力、
get_bでメンバ変数member_bを取得しています。
それぞれのメンバ関数を確認しておいてください。
また、$cmn->member_aと書くと、直接メンバ変数に書き込んだり、取得したり
できます。
★課題
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というメンバ関数を追加してください。
★前回の課題の解答
1. サンプルプログラムを改良し、ファイルサイズが100キロバイトを超えたら、
エラーメッセージを表示するプログラムを作成してください。
2. サンプルプログラムを改良し、アップロードファイルのMIMEタイプが、
JPEG以外の形式だった場合に、エラーメッセージを表示するプログラムを作成して
ください。
→下のサンプルを参照してください。
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// ファイル名
$file_name = $_FILES["upload_file"]["name"];
// 保存するファイルパス
$file_path = "./image.jpg";
// ファイルタイプ
$file_type = $_FILES["upload_file"]["type"];
// ファイルサイズ
$file_size = $_FILES["upload_file"]["size"];
// 課題1
if ($file_size > 100000) {
print "ファイルサイズが大きすぎます。100KB 以下にして下さい。";
exit;
}
// 課題2
if (!strstr($file_type, "jpeg")) {
print "ファイルはJPEGファイルを指定して下さい。";
exit;
}
// ファイルのコピー
if (!copy($_FILES["upload_file"]["tmp_name"], $file_path)) {
print "コピーに失敗しました。" . $file_path;
exit;
}
?>
<img src="./<?=$file_path?>"><br>
ファイル名 : <?=$file_name?><br>
MIMEタイプ : <?=$file_type?><br>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
ファイルサイズに関しては、特に難しいことはないと思います。
課題2の方は、MIMEタイプがJPEGの場合、image/jpegなどという文字列になります
ので、strstr()関数でjpegという文字列があるかどうかをチェックすれば良いです。
|