クラスの基礎知識
クラスの基礎知識
クラスとは、一定のまとまりを持つデータと、その処理方法をまとめたものと考えてください。複雑な構造を持つデータを1つのグループとして扱いたいときに便利です。
また、クラスはデータ型としての性質も持ちます。
たとえば、ここで「人」のクラスを作成してみます。「人」にはいろいろな特徴がありますが、わかりやすくするために、勝手に「名前」と「身長」の2つだけで「hitoクラス」を作ってみることにします。
■クラスの定義
書式
class クラス名
{
プロパティの定義
メソッドの定義
}
プロパティとは、クラスに属する変数のこと。定義方法は次の通りです。
■プロパティの定義
public $プロパティ名;
先頭の「public」はアクセス修飾子というもので、これによりクラスの外でもこの変数が使えるようになります。グローバル変数として定義するのに似ていますね。
「名前」には$namae,「身長」には$sintyoという変数名を付けてクラスを定義してみましょう。次のように記述します。
・hitoクラスの定義とプロパティ
class hito{
public $namae;
public $sintyo;
}
「hito」はクラスの名前。「namae」「sintyo」はプロパティです。変数の前に付いている「public」は、「どこからでも自由に変数が変更できる」ということを示す一般的な記述です。
■メソッドとは
hitoクラスに名前と身長だけ設定しても役に立ちません。ここではわかりやすく人のBMI値を返す関数を定義してみましょう。クラスに属する関数をメソッドと呼び、次の書式で作成します。
メソッドの作成
書式
function メソッド名{
行いたい処理
return 返り値
}
本来、クラスの外からも使えるメソッドであることを表すには、プロパティと同じくアクセス修飾子「public」を付けますが、プロパティと違ってメソッドではアクセス修飾子を省略すると「public」が付いてくるものとして扱われます。今回は記述を見やすくするため、メソッドの「public」は省略しています。
BMIとは体重と身長から計算される人間の体格を表す値です。次で求めることができます。
BMI値 = 体重(kg)/身長(m)✕身長(m)
「BMI値が22のときに最も病気にかかりにくい」とする考え方があります。
身長(m)の二乗✕22が標準体重(kg)」という考え方ですね。ここでは
標準体重(kg)=身長(m)✕身長(m)✕22
と設定し、この標準体重を返すメソッドhyozyunをhitoクラスに作成します。与えられる身長がcm単位の場合は100で割ってm単位にするので、次のようになります。
function hyozyun(){
$s = cm単位の身長/100;
return $s * $s *22;
}
$sはm単位にした身長です。プロパティ$sintyoはcm単位の身長なので「$s=$sintyo/100」としたいところですが、クラス内にあるプロパティを使用する場合、「自分の中の」という意味で「this->」を付けて「$this->sintyo」と記述しなければなりません。このため、「$s=$this->sintyo/100」と書きます。
function hyouzyun(){
$s = $this->sintyo/100;
return $s * $s *22;
}
hyouzyunメソッドがこの「身長*身長*22」を返すようにするために「rerutn $s*$s*22」としています。完成したhitoクラスの定義は、次になります。
class hito{
public $namae;
public $sintyo;
function hyouzyun(){
$s = $this->sintyo/100;
return $s * $s *22;
}
}
■クラスを使う
hitoクラスという「型」だけ定義しても、具体的な「人」がいなくても何もなりません。具体的に作り出した「人」を「オブジェクト」、具体的な「人」を作り出すことを「インスタンス化」といいます。
ここでは次のような具体的な身長175センチの「西沢」さんというオブジェクトを作成してみます。
$namae ➡西沢
$sintyo ➡175
オブジェクトを作成して、変数に代入するときはnewを使って次のようにします。
オブジェクトの生成
$変数 = new クラス名();
変数をobjとすると、hitoクラスのオブジェクトは次のように作成します。
$obj = new hito();
■プロパティとメソッドを使う
プロパティやメソッドを利用する場合、オブジェクト変数に「->」の記号を付けます。
オブジェクト$objのプロパティ「namae」は「$obj->namae」,「sintyo」は「$obj->sintyo」と表します。
具体的に作成した「西沢」さんのオブジェクト$objのプロパティ namaeを「西沢」,「sintyo」を「175」と設定する場合、次のようになります。
$obj->namae="西沢";
$obj->sintyo=175;
またメソッドを使用する場合は、同じく->を使って次のようにします。
$obj->hyozyun();
標準体重を書き出すときは「print $obj->hyouzyun()」となります。
hitoクラスからオブジェクトを作成➡namaeプロパティを「西沢」,sintyoプロパティを「175」に設定➡hyozyunメソッドを実行してメッセージを表示
<?php
$obj = new hito();
$obj->namae = "西沢";
$obj->sintyo = 175;
print $obj->namae."さんの標準体重は<br>";
print $obj->hyouzyun();
class hito{
public $namae;
public $sintyo;
function hyouzyun(){
$s = $this->sintyo/100;
return $s*$s*22;
}
}
?>
実行結果
■静的なメソッド
「クラスを利用するときはnewを使ってインスタンス化する必要がある」と解説したのですが、実はインスタンス化しなくても利用できるメソッドもあり、これを「静的なメソッド」といいます。これには条件があり、
「クラス内のプロパティを使わないメソッド」でなければいけません。
静的なメソッドの作成
書式
static function メソッド名{
行いたい処理
return 返り値
}
例えば、単純に「健康を大切にしましょう」という文字列を書き出すmessageメソッドをhitoクラスの中に作成する場合は、次のようになります。
static function message(){
print"健康を大切にしましょう";
}
上記ではクラス内のプロパティなどを使っていません。単純に文字列を書き出すだけです。ですからこのmessageメソッドを使うだけなら、わざわざnewで個々のオブジェクトを作ることは無駄なわけです。
静的メソッドを利用するときは「->」ではなく「::」(コロンを2つ)を使って、次のように記述します。
静的メソッドの実行
書式
クラス名::メソッド名
次は上記で「class_bmi_1.php」に静的メソッドmessage()を設定し、それを使っている例です。
<?php
hito::message();
class hito{
public $namae;
public $sintyo;
function hyouzyun(){
$s = $this->sintyo/100;
return $s*$s*22;
}
static function message(){
print"健康を大切にしましょう";
}
}
?>
実行結果
newを使うことなく「hito::message()」としています。このように静的メソッドの場合、インスタンス化することなく利用することができます。