【PHP】クラス変数とは? – クラス単位の変数(static)の使い方を解説

クラスにはクラス変数と呼ばれるものがあります。

クラス変数はクラス単位の変数になります。

ここでは初心者向けにクラス変数について解説します。

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

★ 目的

  • クラス変数を理解する。
  • クラス変数を使えるようになる。

クラス変数とは

クラス変数とはクラス単位の変数のことです。

クラス変数は異なるインスタンスでも同じ変数を利用するため、記憶されたデータも共有します。

クラス変数の構文

クラス変数を含めたクラスの基本構文は次のようになります。

class クラス名 {

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

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

クラス変数を定義している部分は3行目の『アクセス修飾子 static クラス変数』の部分です。

クラス変数の使い方

次のクラス変数を使用したサンプルコードをご覧ください。

ソースコード

<?php

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

// 税率を出力
echo Bill::$tax . "\n";

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

// 合計金額を出力
echo "*******************\n";
$item1->total();
$item2->total();

// 税率を変更
Bill::$tax = 0.5;

// 合計金額を出力
echo "*******************\n";
$item1->total();
$item2->total();

?>

実行結果

0.1
*******************
----------
小計  : 100
税率  : 0.1
合計  : 110
----------
小計  : 1500
税率  : 0.1
合計  : 1650
*******************
----------
小計  : 100
税率  : 0.5
合計  : 150
----------
小計  : 1500
税率  : 0.5
合計  : 2250

Billクラスはお会計の合計金額を計算するクラスです。

7行目でクラス変数を定義し、税率を10%(0.1)としています。

31行目に『Bill::$tax』と記述があり、これがクラス変数へのアクセスになります。クラス変数へのアクセスは次のような構文になります。

クラス::クラス変数

『Bill::$tax』も構文に従った記述になっており、、実行結果の1行目で0.1と出力されているため、正しくアクセスできていることがことが分かります。

また、totalメソッドで『self::$tax』の記述がありますが、これはクラス内ではselfとすることで『自身のクラス』という意味になります。そのため、『self::$tax』でアクセスできるようになっています。

39行目、40行目で各インスタンスのtotalメソッドを実行しており、実行結果から異なるインスタンス同士でも税率が同じであることが確認できます。

なお、クラス変数のデータの再代入は44行目のように記述します。

クラス::クラス変数 = データ

47行目、48行目で各インスタンスのtotalメソッドを再度、呼び出していますが、実行結果から税率が変わっていることが確認できます。

まとめ

クラス変数はクラス単位の変数になります。

異なるインスタンス同士でも同じ変数を使うことができるため、インスタンスに依存しない変数はクラス変数として定義すると良いでしょう。