30. インスタンスメソッド

インスタンスメソッド

クラスメソッドとは

OOPのメソッドは「歩く」「話す」「戦う」といった、オブジェクトの動作や振る舞いのことを指します。クラスメソッドは、クラス内に定義したメソッドのことを指します。

メソッドの例

項目 メソッド 備考
歩く walk スピード、方向などでキャラクターを移動する
話す talk 内容、相手などを指定して会話する
鳴く cry キャラクターの能力、武器などから、相手に攻撃する

インスタンスメソッドの定義

インスタンスメソッドは「修飾子」「メソッド名」「データ型」でクラス内に定義します。PHPの場合、データ型は省略できます。

public class クラス名 {
    //インスタンスメソッド
    修飾子 メソッド名(): データ型 {

    }
}

クラスメソッドの定義

次にユーザの動作として、talk() を定義してみます。

<?php
class Character
{
    public string $name;
    public string $job;
    public int $hp;

    public function walk(string $direction): void
    {
        $message = "{$this->name} move {$direction}";
        echo $message, PHP_EOL;
    }
}

インスタンスと引数

インスタンスを引数で渡す

作成したインスタンスは、メソッドの引数で渡すことができます。

talk() メソッドの実装

talk() メソッドを追加してみましょう。引数は「Characterオブジェクト」と「文字列」とします。

Character.php
<?php
class Character
{
    ...

    public function talk(Character $character, string $message): void
    {
        $message = "{$character->name}!{$message}";
        echo $message, PHP_EOL;
    }
}

talk() メソッドの実行

「character_action.php」で新しいキャラクター「warrior」を作成し、talk() メソッドに渡してみましょう。

character_action.php
...

$warrior = new Character();
$warrior->name = "ボブ";
$warrior->job = "warrior";
$warrior->hp = 50;

$wizard->walk("left");
$wizard->talk($warrior, "勝負しましょう!");
結果
アリス move to left
ボブ!勝負しましょう!

インスタンスの参照

インスタンスはメモリーに保持

作成したインスタンスは、PHPのメモリーに状態を保持されます。

attack() メソッドの実装

attack() メソッドを実装し、引数で渡された Characterオブジェクトの「hp」を計算します。ここでは、damage変数の値だけ引き算しました。

Character.php
public class Character {
	...

	public void attack(Character character) {
		int damage = 1;
		character.hp -= damage;
	}

}
App.java
...

echo $warrior->hp;
echo PHP_EOL;

$wizard->attack($warrior);
echo $warrior->hp;
echo PHP_EOL;
結果

「warrior」オブジェクトの「hp」の数値が変化しました。

アリス move to left
ボブ!勝負しましょう!
50
49

演習

つぎのプログラムがあります。

Animal.java
<?php
class Animal
{
    public string $name;
    public string $type;
    public string $crying;

    public function walk(): void
    {
        $message = "{$this->name}が歩いた。";
        echo $message;
        echo PHP_EOL;
    }

    public  function cry(): void
    {
        echo $this->crying;
        echo PHP_EOL;
    }

    public function escape(): void
    {
        $message = "{$this->name}が逃げた。";
        echo $message;
        echo PHP_EOL;
    }
}
animal_action.php
<?php
require_once 'models/Animal.php';

$dog = new Animal();
$dog->type = "dog";
$dog->name = 'ポチ';
$dog->crying = 'わん!';

$cat = new Animal();
$cat->type = "cat";
$cat->name = "ミケ";
$cat->crying = "にゃー!";

$dog->walk();
$dog->cry();
$cat->cry();
$cat->escape();

問題1

walk() のことを何といいますか?

1)static変数

2)staticメソッド

3)インスタンス変数

4)インスタンスメソッド

問題2

「AnimalApp.java」を実行した結果はどれですか?

1)わん! ポチが歩いた にゃー!

2)わん! ポチが歩いた にゃー! ミケが逃げた

3)わん! ポチが歩いた ミケが逃げた

4)わん! にゃー! ミケが逃げた

PHP超入門