クラスの基礎知識

クラスの基礎知識

クラスとは、一定のまとまりを持つデータと、その処理方法をまとめたものと考えてください。複雑な構造を持つデータを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スクリプトは次のようになります。

class_bmi_1.php

<?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;
   }
}
?>

実行結果

f:id:mkyosuke:20191203180317p:plain

■静的なメソッド

「クラスを利用するときは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"健康を大切にしましょう";
     }
}
?>

実行結果

f:id:mkyosuke:20191204105808p:plain

 newを使うことなく「hito::message()」としています。このように静的メソッドの場合、インスタンス化することなく利用することができます。