ITHACK
~ みんなのIT部門 ~
【PHP】$this(擬似変数) - オブジェクト(インスタンス)自身を記憶する変数

【PHP】$this(擬似変数) - オブジェクト(インスタンス)自身を記憶する変数

オブジェクトの内部から自身のフィールにアクセスするには$thisを使います。

ここでは、$thisについて解説します。

検証環境

$this

$thisは“オブジェクト自身を記憶する擬似変数”です。

PHPが事前に用意した変数であり、オブジェクトの内部処理のみで使用が可能です。

主にオブジェクトの内部処理(メソッド等)から自身のフィールドや他のメソッドにアクセスする場合に使用します。

基本構文

オブジェクト自身を取得する箇所で$thisを記述します。

$this

この$thisを介して、自身のフィールドやメソッドへのアクセスが可能です。

フィールド

$this->フィールド名

メソッド

$this->メソッド名(実引数)

サンプル

<?php

// 人間クラス
class Person {
    
    // 苗字
    public $l_name;
    // 名前
    public $f_name;
    
    // フルネームの取得
    public function full_name() {
        ___ih_hl_start
        $name = $this->l_name . ' ' . $this->f_name;
        ___ih_hl_end
        return $name;
    }
    
    // あいさつ
    public function greeting() {
        echo "Hey!\n";
        ___ih_hl_start
        echo "My name is ". $this->full_name() . ".\n";
        ___ih_hl_end
    }
    
}

$person = new Person();
$person->l_name = 'TANAKA';
$person->f_name = 'TARO';

$person->greeting();

?>
$ php sample.php
Hey!
My name is TANAKA TARO.

Personクラスは苗字と名前の2つのフィールドとfull_namegreetingの2つのメソッドを持ちます。

各メソッドで$thisを使用しており、full_nameメソッドは$thisを使い、自身の苗字($l_name)と名前($f_name)を結合し、戻り値として返します。

greetingメソッドはあいさつのメッセージを出力し、$thisを使って、full_nameメソッドを呼び出し、フルネームを取得しています。

また、$thisはそのオブジェクト自身を記憶するため、オブジェクトが異なれば、フィールドに記憶されている値も異なります。

<?php

// 人間クラス
class Person {
    
    // 苗字
    public $l_name;
    // 名前
    public $f_name;
    
    // フルネームの取得
    public function full_name() {
        $name = $this->l_name . ' ' . $this->f_name;
        return $name;
    }
    
    // あいさつ
    public function greeting() {
        echo "Hey!\n";
        echo "My name is ". $this->full_name() . ".\n";
    }
    
}

___ih_hl_start
$person1 = new Person();
$person1->l_name = 'TANAKA';
$person1->f_name = 'TARO';

$person2 = new Person();
$person2->l_name = 'SUZUKI';
$person2->f_name = 'JIRO';

$person1->greeting();
$person2->greeting();
___ih_hl_end

?>
$ php sample.php
Hey!
My name is TANAKA TARO.
Hey!
My name is SUZUKI JIRO.

24〜31行目で2つのオブジェクトの生成とフィールド値の設定を行っています。

それらのオブジェクトに対し、33〜34行目でgreetingメソッドを呼び出していますが、各処理の出力結果は名前の部分が異なります。

これは上述したとおり、$thisは自身のオブジェクトを記憶しており、それを介してアクセスするフィールドも各値になるためです。

演習問題

問題1

次の実行結果になる車クラスを扱うプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 車クラスを作成する
  • 車クラスのフィールドはナンバー、色、乗車人数とする
  • 車情報を出力するinfoメソッドを作成する
===== 車情報 =====
ナンバー : 1234
色    : 紺色
乗車人数 : 5人
===== 車情報 =====
ナンバー : 0987
色    : 赤
乗車人数 : 2人

問題2

次の実行結果になる家クラスを扱うプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 家クラスを作成する
  • 家クラスのフィールドは階数、間取り、完成日とする
  • 家情報を出力するinfoメソッドを作成する
===== 家情報 =====
階数  : 1階
間取り : 3LDK
完成日 : 2022/01/25
===== 家情報 =====
階数  : 3階
間取り : 10LDK
完成日 : 2020/03/24
===== 家情報 =====
階数  : 2階
間取り : 5LDK
完成日 : 2021/08/01