【PHP】クラスメソッドとは? – クラス単位のメソッド(static)の使い方を解説

クラスにはクラスメソッドと呼ばれるものがあります。

クラスメソッドはクラス単位のメソッドになり、インスタンスには依存しません。

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

なお、クラスをご存知でない方は先に次の記事をご覧いただくことをお勧めします。

★ 目的

  • クラスメソッドを理解する。
  • クラスメソッドを使えるようになる。

クラスメソッドとは

クラスメソッドはクラス単位のメソッドのことです。

通常のメソッドと異なる点は、クラスからメソッドを直接実行できることです。

クラスメソッドの構文

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

class クラス名 {

    アクセス修飾子 static クラス変数

    アクセス修飾子 プロパティ変数

    アクセス修飾子 static function クラスメソッド名( 引数 ) {
        // 処理1
        // 処理2
        // ・・・・・・・
    }

    アクセス修飾子 function メソッド名( 引数 ) {
        // 処理1
        // 処理2
        // ・・・・・・・
    }

}

7行目〜11行目までがクラスメソッドの定義になります。

基本的には通常のメソッドと同じですが、異なる点は『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 "税率  : ".self::$tax."\n";
    }
    
    // 合計金額を出力する
    public function total() {
        // 合計金額
        $total = $this->price + $this->price * self::$tax;
        // 合計金額を出力
        echo "----------\n";
        echo "小計  : ".$this->price."\n";
        self::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行目がクラスメソッドの定義になります。

36行目で『Bill::display_tax()』とありますが、これがクラスメソッドの呼び出しになります。

基本構文は次のようになっており、『Bill::display_tax()』も構文に従った記述になっていることが分かります。

クラス::メソッド()

また、29行目では通常のメソッドの処理の中で、クラスメソッドを呼び出しています。

クラス内でselfと記述すると自身のクラスという意味になるため、この記法でクラスメソッドを呼び出すことが可能です。

注意点

クラスメソッドを使う際の注意点は、

クラスメソッドの処理ではインスタンスに関する処理(プロパティへのアクセスやメソッドの実行)が行えない

ということです。つまり$thisが使えないということになり、記述するとエラーになりますので注意しましょう。

まとめ

クラスメソッドはクラス単位のメソッドです。

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