はじめに
前回の記事では、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のコールバック関数について紹介します。
次回の記事