PHPのクラスについてです。今回の記事ではオブジェクト指向とクラスと、コンストラクタとはの簡単な理解が必要になります。PHPは関数だけでなく、クラスも利用することができます。今回はPHPでのクラスの基本的な書き方などを学んでいきます。

PHPのクラス

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 2019年08月14日

PHPのクラスについてです。今回の記事ではオブジェクト指向とクラスと、コンストラクタとはの簡単な理解が必要になります。

PHPは関数だけでなく、クラスも利用することができます。今回はPHPでのクラスの基本的な書き方などを学んでいきます。

クラスの作成

PHPでのクラス作成の基本について学んでいきます。クラスについては5記事に分けて記載する予定なので、今回は基本となる書き方について学んでいきましょう。

クラスの構文

下記が構文となります。

class クラス名 {
	var $クラス内変数名
	
	// コンストラクタ
	function __construct($引数1, $引数2, ...) {
		//コンストラクタの処理を記述
	}

	// メソッド(クラス内関数)
	function クラス内関数名($引数1, $引数2, ...) {
		//処理を記述
	}
}

こちらが基本的な構文になります。クラス内変数、クラス内関数はオブジェクト指向とクラスの記事でご説明したように、クラス内変数=メンバー変数、クラス内関数=メンバー関数またはメソッドと言います。メンバー変数、メンバー関数はいくつでも作成することが可能です。

また、クラスのみを定義するPHPファイルを配置する場合には、ファイル名をクラス名.phpとしておくのが慣例です。

実際のコード

実際にクラスを作成してみましょう。今回はオブジェクト指向とクラスと、コンストラクタとはの記事で例として取り上げたゲームなどでよく出てくるモンスターを例にコードを書いてみました。

<?php

// モンスター設計図(モンスタークラス)
class Monster {

	// モンスターの名前変数
	var $name;
	// モンスターのヒットポイント変数
	var $hitPoint;
	// モンスターの攻撃力変数
	var $attackPoint;
	// モンスターの防御力変数
	var $defensePoint;

	// コンストラクタ - インスタンス生成時に1度だけ実行されます
	function __construct($name, $hitPoint, $attackPoint, $defensePoint) {
		// $thisはインスタンス自身を示します
		// $this->nameは作成されたインスタンスのモンスターの名前変数となります。その他も同様に上で定義された変数を示します
		// 引数で受け取った$nameなどの値をインスタンス自身のメンバー変数に代入します
		$this->name = $name;
		$this->hitPoint = $hitPoint;
		$this->attackPoint = $attackPoint;
		$this->defensePoint = $defensePoint;
	}

	// 攻撃する処理
	// 最後にインスタンスで決められた攻撃力を返却します
	function attack() {
		echo $this->name . "は相手のモンスターに" . $this->attackPoint . "ポイントの攻撃を与える!<br>";
		return $this->attackPoint;
	}

	// 防御する処理
	// 引数に敵の攻撃力を入力します
	function defense($enemyAttackPoint) {

		//敵の攻撃力から自分の防御力を引いてダメージ計算します
		$damage = $enemyAttackPoint - $this->defensePoint;

		// インスタンス生成時に決められたヒットポイントからダメージ計算値分だけ引きます
		$this->hitPoint -= $damage;
		echo $this->name . "は相手のモンスターから" . $damage . "ダメージ受けた!<br>";
		echo $this->name . "の現在のヒットポイントは" . $this->hitPoint . "です。<br>";
	}
}

// 実際の処理(インスタンス生成や攻撃、防御の実行)

// $dragon変数にはモンスターのインスタンス(実体)が入ります
// コンストラクタで定義した引数に合わせてカッコの中を指定します
// このインスタンスの $nameには"ドラゴン"・$hitPointには200・$attackPointには20・$attackPointには20・$defencePointには10が入ります
$dragon = new Monster("ドラゴン", 200, 20, 10);
// $oni変数にもモンスターのインスタンス(実体)が入ります
// こちらにはドラゴンより弱い鬼を作ってみました
$oni = new Monster("鬼", 100, 15, 5);

// 鬼の防御とドラゴンの攻撃
// 攻撃処理の結果は、そのモンスターの攻撃力が返却されるため、その攻撃力を鬼の防御する引数として利用します
$oni->defense($dragon->attack());
echo "<br>";
// ドラゴンの防御と鬼の攻撃
$dragon->defense($oni->attack());

今回はモンスターの設計図(クラス)からドラゴンのインスタンスと鬼のインスタンスを作成して1回ずつ攻撃と防御までさせてみました。

解説

基本的にインスタンスを作成後は、メソッドやメンバー変数にインスタンスが格納されている変数->メソッド名()またはインスタンスが格納されている変数->メンバ変数名のようにアクセスできます。

クラスはあくまで設計図で、インスタンス化して初めて実体ができるため、インスタンスを格納した変数から->この記号でインスタンス内部のメソッドや変数にアクセスします。

モンスタークラスまで

少しわかりづらい部分はコンストラクタ内の処理かと思います。
$thisを使用することで、生成されるインスタンス自身を表すことができます。

そのため、$this->nameと書いた部分はその生成されたモンスターの名前のデータを表します。$this->name = $nameと書くことで、引数で受け取る$nameの値をモンスターの名前として代入することになります。

その他メンバー変数についても同様です。クラス内変数を利用する際には$this->nameのようにnameなどのクラス内変数に$がないのがポイントです。

また、クラス名は大文字から始めるのがルールです。

実際のインスタンス生成から攻撃防御まで

モンスタークラスは設計しました。実際にモンスターを作成するインスタンス生成と攻撃防御までを解説します。

2体のモンスターを作成

今回はドラゴンと鬼の2つのモンスターを作ってみました。

まずはコンストラクタの処理をしっかり見ていきましょう。

__construct($name, $hitPoint, $attackPoint, $defensePoint)と書いてあります。コンストラクタはインスタンス生成時に実行されるため、インスタンスを作る際にこの引数に合わせて作成していきます。実際に作成しているのが、$dragon = new Monster("ドラゴン", 200, 20, 10);$oni = new Monster("鬼", 100, 15, 5)の部分です。

例えば、$dragon = new Monster("ドラゴン", 200, 20, 10);という部分では、$dragonという変数に、生成したモンスターのインスタンスを代入しています。
new Monster("ドラゴン", 200, 20, 10);この部分がインスタンス生成の命令となり、コンストラクタで設定した引数に合わせて丸括弧内に決めたいデータを設定します。

これでドラゴンという名前のモンスターで、ヒットポイントは200、攻撃力20、防御力10のモンスターが作成されることになります。
インスタンスを作成するためには、new クラス名(コンストラクタの引数)という書き方をします。

$oniという変数にはドラゴンより弱そうな、鬼というモンスターを作成しました。

攻撃と防御の実行

実際の攻撃防御のやり取りが以下のコードです。
$oni->defense($dragon->attack());

$oniには鬼という名前のモンスターの実体(インスタンス)が代入されています。
$oniはインスタンスが格納されているため、名前(name)やヒットポイント(hitPoint)・攻撃力(attackPoint)・防御力(defensePoint)・攻撃処理(attackメソッド)・防御処理(defenseメソッド)が使える状態です。$dragonも同様にドラゴン用の各種データやメソッドが使える状態です。

もう少し掘り下げて見てみましょう。

実際に鬼の防御処理を行っている場所が$oni->defense(引数)の部分です。
インスタンスが格納されている変数->メソッド名(メソッドの引数)と書くことによって、クラスで作成したメソッドの処理を実際に行うことができます。

逆にドラゴンの攻撃処理部分が$dragon->attack()です。attackメソッドには引数は不要でした。そしてこの攻撃処理ではreturn $this->attackPointとなっていましたね。これはインスタンス自身の攻撃力を返り値として返却するという関数の機能です。そのため$dragon->attack()とすると、これ自体がドラゴンの攻撃力である20という意味になります。

$oni->defense($dragon->attack());の処理をまとめて解読してみましょう。

$dragonの攻撃処理を実行→ドラゴンの攻撃力20が返却され、その攻撃力20を$oniの防御処理の引数として代入→$oniの防御処理が実行

という流れになります。

実行結果

攻撃時や防御時にechoで出力しているため、実行結果が以下のようになります。

モンスタークラスから2つのインスタンスを生成し、実行
モンスタークラスから2つのインスタンスを生成し、実行

インスタンス生成時の初期値からうまく計算されて画面に出力されることになりますね。

もちろんドラゴンのインスタンスも、鬼のインスタンスも処理が終了されるまでヒットポイントなどはダメージ処理された後の値として取得されます。

まとめ

PHPのクラスをモンスタークラスを例として扱ってみました。
重要なのは、「クラスはあくまでも設計図であること」、「インスタンス生成時に実体が作られること」、「インスタンスそれぞれで値をしっかり持っていること」です。

それぞれのインスタンス内のメンバー変数の値を意識しながらコードを書いていくことでクラスの理解が深まっていきます。

クラスとしてのコードは40行ほど書きましたが、実際の処理を実行する部分では5行ほどになっています。
クラスを1つ作成しただけで、2つのインスタンス(今回は2つのモンスター)の処理をそれぞれ簡単に書くことができるようになりました。

ヒットポイントが0になった後の処理などは防御処理時にif文などで追記するだけですべてのモンスターの処理に実装されたことになります。ぜひこのコードを改良してみてください。

今回はPHPのクラスの基本的な機能を扱ってみました。次回はもう少し踏み込んだ機能について解説していきます。