ITHACK
~ みんなのIT部門 ~

【PHP】クラス変数(static) – クラスレベルの変数

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

ここではクラス変数について解説します。

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

  • クラス変数

クラス変数とは

クラス変数はクラスレベルの変数のことです。
クラス変数は同じクラスから生成したインスタンス同士で共通の変数になります。

基本構文

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

定義

class クラス名 {
    アクセス修飾子 static $クラス変数名;
}

クラス変数は先頭にstaticを付けて定義します。

値の取得

クラス名::$クラス変数名

クラス変数の値を取得するには、クラス名とクラス変数をダブルコロン(::)で繋げて記述します。

値の記憶

クラス名::$クラス変数名 = 値

クラス変数に値を記憶するには、代入演算子(=)を使います。
クラス変数の指定方法は値の取得と同様でダブルコロン(::)でクラス名とクラス変数をつなげて記述します。

サンプルコード

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

<?php

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

// 税率を記憶
Bill::$tax = 0.1;

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

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

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

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

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

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

Billクラスはお会計クラスです。
7行目でクラス変数$taxを定義しています。

31行目と44行目で$taxに値を記憶しており、20行目で$taxの値を取得しています。

また、クラス変数はインスタンス間で共通の変数のため、$item1$item2のtotalメソッドで税率が同じ値になっていることが実行結果から分かります。

演習問題

問題1

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

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

問題2

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

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

まとめ

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