PHP入門

staticプロパティとstaticメソッド | 初心者でもわかるPHP入門

2021年7月2日

はじめに

前回の記事では、PHPの継承とオーバーライドについて紹介しました。

本記事では、PHPのstaticプロパティとstaticメソッドのついて紹介します。

staticキーワード

クラスのプロパティ(変数)やメソッド(関数)にstaticをつけると、クラスのオブジェクト(インスタンス)を生成せずにアクセスできます

staticのイメージ

staticプロパティは「クラス名::プロパティ名」、staticメソッドは「クラス名::メソッド名」のようにスコープ定義演算子(::)を使ってアクセスできます。

Test::$num  // staticプロパティ

Test::sampleMethod();  // staticメソッド

staticプロパティ

スポンサーリンク

staticプロパティの特徴

staticがついていないプロパティは、クラスのオブジェクト(インスタンス)を生成したタイミングで作られます。

そして、生成したクラスのオブジェクト(インスタンス)毎に管理されています。(クラスのオブジェクト毎に変数が作られる)

非staticのプロパティ

staticプロパティは、クラスのオブジェクト(インスタンス)生成に関係なく作られる変数です。(staticプロパティに最初にアクセスしたタイミングで作られる)

そのため、クラスのオブジェクト(インスタンス)に関係なく共通で管理しています。(共通で1つの変数が作られる)

staticのプロパティ

staticプロパティの実装例

それでは、実際にPHPのソースコードでstaticプロパティの使い方を紹介します。

次の例では、プロパティ「$num」とstaticプロパティ「$staticNum」を定義し、「addNum」メソッドでプロパティとstaticプロパティの値に1を加算しています。

また、staticプロパティはスコープ定義演算子 (::) 、staticではないプロパティはオブジェクト演算子 (->) を使ってアクセスしています。

[staticプロパティの使用例]

<?php

class NumPrint {
    // プロパティ
    public $num = 0;
    // staticプロパティ
    public static $staticNum = 0;
    public function addNum() {
        // プロパティを加算
        $this->num++;
        // staticプロパティを加算
        self::$staticNum++;
    }
}

$numPrint = new NumPrint();
$numPrint->addNum();

print "プロパティの値".$numPrint->num;
print ", staticプロパティの値".NumPrint::$staticNum;

$numPrint2 = new NumPrint();
$numPrint2->addNum();

print "<br />プロパティの値".$numPrint->num;
print ", staticプロパティの値".NumPrint::$staticNum;

?>

[実行結果]

プロパティの値1, staticプロパティの値1
プロパティの値1, staticプロパティの値2

プログラムを実行した結果、staticではないプロパティは、クラスのオブジェクト毎に管理している変数のため、出力結果はいずれも「1」です。

staticプロパティは、クラスのオブジェクトに関係なく共通で管理している変数のため、出力結果は「addNum」メソッドを1回呼び出したあとは「1」、2回目の呼び出しのあとは「2」と、$numPrintのオブジェクトと$numPrint2のオブジェクトで値を共有しているのがわかります。

staticプロパティは、静的な変数であり、クラスのオブジェクト毎に管理しているプロパティとは違い、staticプロパティの実体は1つです。

staticメソッド

staticメソッドとは、クラスのオブジェクト(インスタンス)を生成せずにアクセスできるメソッドのことです。

[staticメソッドの使用例]

<?php

class Sample {
    // staticメソッド
    public static function printTest() {
        print "staticメソッド";
    }
}

Sample::printTest();

?>

[実行結果]

staticメソッド

staticプロパティと同様に、staticメソッドはスコープ定義演算子 (::) を使ってアクセスします。

終わりに

本記事では、staticプロパティとstaticメソッドについて紹介しました。

次回の記事では、PHPのコールバック関数について紹介します。

helpful