はじめに
前回の記事では、PHPの継承とオーバーライドについて紹介しました。
前回の記事
本記事では、PHPのstaticプロパティとstaticメソッドのついて紹介します。
staticキーワード
クラスのプロパティ(変数)やメソッド(関数)にstaticをつけると、クラスのオブジェクト(インスタンス)を生成せずにアクセスすることができます。
staticプロパティは「クラス名::プロパティ名」、staticメソッドは「クラス名::メソッド名」のようにスコープ定義演算子(::)を使ってアクセスできます。
Test::$num // staticプロパティ
Test::sampleMethod(); // staticメソッド
staticプロパティ
スポンサーリンク
staticプロパティの特徴
staticがついていないプロパティは、クラスのオブジェクト(インスタンス)を生成したタイミングで作られます。
そして、生成したクラスのオブジェクト(インスタンス)毎に管理されています。(クラスのオブジェクト毎に変数が作られる)
staticプロパティは、クラスのオブジェクト(インスタンス)生成に関係なく作られる変数です。(staticプロパティに最初にアクセスしたタイミングで作られる)
そのため、クラスのオブジェクト(インスタンス)に関係なく共通で管理しています。(共通で1つの変数が作られる)
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メソッドとは、クラスのオブジェクト(インスタンス)を生成せずにアクセスできるメソッドのことです。
[staticメソッドの使用例]
<?php class Sample { // staticメソッド public static function printTest() { print "staticメソッド"; } } Sample::printTest(); ?>
[実行結果]
staticメソッド
staticプロパティと同様に、staticメソッドはスコープ定義演算子 (::) を使ってアクセスします。
終わりに
本記事では、staticプロパティとstaticメソッドについて紹介しました。
次回の記事では、PHPのコールバック関数について紹介します。
次回の記事