【PHP】self - 自身のクラスを表すキーワード

【PHP】self - 自身のクラスを表すキーワード

自身のクラスを表すselfキーワードがあります。

selfキーワードはクラス内で、クラス名の代わりに使うことが可能です。

ここでは、selfキーワードについて解説します。

検証環境

self

selfキーワードは“自身のクラスを表すキーワード”です。

クラス内で使用し、クラス変数やクラスメソッド、クラス定数のアクセス時にクラス名の代わりに使うことができます。

self::クラス変数

クラス内のクラス変数のアクセス時に、クラス名の代わりにselfを使用できます。

基本構文

self::クラス変数

サンプル

<?php

// 人間クラス
class Person {
    
    public static $greeting = 'Hello.';
    
    public function test() {
        ___ih_hl_start
        echo self::$greeting;
        ___ih_hl_end
    }
}

$person = new Person();

$person->test();

?>
$ php sample.php
Hello.

9行目のself::$greetingselfキーワードを使ったクラス変数のアクセスです。

このコードはPerson::$greetingと同等の処理を行います。

self::クラスメソッド

クラス内のクラスメソッドのアクセス時に、クラス名の代わりにselfを使用できます。

基本構文

self::クラスメソッド名(実引数1, 実引数2 ...)

サンプル

<?php

// 人間クラス
class Person {
    
    public static function greeting() {
        echo 'Hello.';
    }
    
    public function test() {
        ___ih_hl_start
        self::greeting();
        ___ih_hl_end
    }
}

$person = new Person();

$person->test();

?>
$ php sample.php
Hello.

11行目のself::greeting()selfキーワードを使ったクラスメソッドの呼び出しです。

このコードはPerson::greeting()と同等の処理を行います。

self::クラス定数

クラス内のクラス定数のアクセス時に、クラス名の代わりにselfを使用できます。

基本構文

self::クラス定数

サンプル

<?php

// 人間クラス
class Person {
    
    public const GREETING = 'Hello.';
    
    public function test() {
        ___ih_hl_start
        echo self::GREETING;
        ___ih_hl_end
    }
}

$person = new Person();

$person->test();

?>
$ php sample.php
Hello.

9行目のself::GREETINGselfキーワードを使ったクラス定数のアクセスです。

このコードはPerson::GREETINGと同等の処理を行います。

メリット

selfキーワードはクラス内でのみ使用可能で、明確に自身のクラスを表します。

そのため、誤って他のクラス名を記述してしまうことを回避できます。

また、クラス名を変更した場合、selfキーワードの部分は修正する必要がありません。

デメリット

selfキーワードのデメリットは特別ありませんが、強いて挙げるなら、コード量の多いクラスでは分かりづらくなる可能性があることです。

コード量が多いクラスを読む時に、そのクラスが何のクラスであるか忘れてしまった場合、selfキーワードでは曖昧な理解になってしまいます。

ただ、これは大きな損を生むことは考えにくく、selfキーワードを使うことによる恩恵の方が大きいでしょう。

演習問題

問題1

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

  • 車クラスを作成する
  • 車クラスのフィールドはナンバー、色、乗車人数とする
  • 車クラスのインスタンスの初期値はコンストラクタで設定する
  • タイヤ数はクラス変数とする
  • 車情報を出力するinfoメソッドを作成する
  • タイヤ数を出力するtires_infoメソッドを作成する
    ※ tires_infoはクラスメソッドとします。
  • クラス内でのクラス変数・クラスメソッドへのアクセスはselfキーワードを使う
===== 車情報 =====
ナンバー : 1234
色    : 紺色
乗車人数 : 5人
タイヤ数 : 4個
===== 車情報 =====
ナンバー : 0987
色    : 赤
乗車人数 : 2人
タイヤ数 : 4個

問題2

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

  • 家クラスを作成する
  • 家クラスのフィールドは面積(単位:畳)とする
  • 家クラスのインスタンスを3つ生成し、各面積(畳)は次の通りとする
    1つ目 : 6
    2つ目 : 14
    3つ目 : 30
  • 家クラスのインスタンスの初期値はコンストラクタで設定する
  • 畳の高さ(1.82m)と横幅(0.91m)を記憶するクラス定数を定義する
  • クラス定数を使って家の面積(平方メートル)を出力するareaメソッドを作成する
  • クラス内でのクラス定数へのアクセスはselfキーワードを使う
面積 : 9.9372平方メートル
面積 : 23.1868平方メートル
面積 : 49.686平方メートル