ITHACK
~ みんなのIT部門 ~

【PHP】クラスメソッド(static) – クラスレベルのメソッド

クラスにはクラスメソッドと呼ばれる仕組みがあります。
クラスメソッドはクラスレベルのメソッドで、同じクラスのインスタンス同士で共通のメソッドになります。

ここではクラスメソッドについて解説します。

なお、クラスについては次の記事をご覧ください。

  • クラスメソッド

クラスメソッドとは

クラスメソッドはクラスレベルのメソッドのことです。
同じクラスのインスタンス同士で共通のメソッドになり、クラスから直接実行できます。

また、クラスメソッドでフィールドにアクセスすることはできません。

基本構文

クラスメソッドの基本構文は次のようになります。

定義

class クラス名 {
    アクセス修飾子 static function クラスメソッド名( $引数名 ) {
        // 処理・・・・・・・
        return $変数名または値;
    }
}

2~4行目がクラスメソッドの定義になります。
基本的には関数や通常のメソッドと同じですが、functionの前にstaticを付けます。

呼び出し

クラス名::クラスメソッド名(引数値)

クラスメソッドを実行するにはクラス名とクラスメソッドをダブルコロン(::)で繋げて記述します。
通常のメソッドと同様に引数がある場合は、丸括弧(())に変数または値を記述します。

サンプルコード

クラスメソッドを使ったサンプルコードをご覧ください。

<?php

// クラス
class Bill {
    
    // 税率
    public static $tax = 0.1;
    
    // 料金
    public $price;
    
    // コンストラクタ
    public function __construct( $price ) {
        $this->price = $price;
    }
    
    // 税率を出力する
    public static function display_tax() {
        echo "税率  : ".Bill::$tax."\n";
    }
    
    // 合計金額を出力する
    public function total() {
        // 合計金額
        $total = $this->price + $this->price * Bill::$tax;
        // 合計金額を出力
        echo "--------------\n";
        echo "小計  : ".$this->price."\n";
        Bill::display_tax();
        echo "合計  : ".$total."\n";
    }
    
}

// 税率を出力
Bill::display_tax();

// インスタンスの生成
$item1 = new Bill(100);
$item2 = new Bill(1500);

// 合計金額を出力
$item1->total();
$item2->total();

?>
税率  : 0.1
--------------
小計  : 100
税率  : 0.1
合計  : 110
--------------
小計  : 1500
税率  : 0.1
合計  : 1650

Billクラスはお会計クラスで、18~20行目がクラスメソッドの定義になります。
29行目と36行目のBill::display_tax()がクラスメソッドの呼び出しになります。

注意点

クラスメソッドを使う際の注意点は、$this(擬似変数)が使えないということです。
つまり、クラスメソッドではインスタンスのフィールドやメソッドへのアクセスが行えません。

$thisを記述するとエラーになりますので注意しましょう。

演習問題

問題1

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

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

問題2

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

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

まとめ

クラスメソッドはクラスレベルのメソッドです。
インスタンスに関係なく、同じ処理を行う場合はクラスメソッドにすると良いでしょう。