はじめに
この記事はプログラミング初学者による備忘録用の記事であり、少しでも他の初学者のお役に立てればと思い書いています。
今回は、PHPを学ぶ過程で、staticについて気になったので調べてみました。
間違いなどがございましたら、ご指摘のほどよろしくお願い致します。
staticの使い方
staticを宣言することで、クラスに属したプロパティまたはメソッド(newせずに利用できるプロパティやメソッド)
になります。
つまり、インスタンスの状態に依存しない処理をさせることができます。
これはユーティリティメソッドとも呼ばれ、決まりきったお約束の処理などに用いられます。
※静的メソッドの中では$thisは使えませんので注意してください。
プロパティにstaticをつけた場合
プロパティが属するクラスに固定で配置される
属するクラスが固定されるということは、どこからでもこのプロパティにアクセスできるということであり、また、インスタンス間で共通としてプロパティが存在することになる。
サンプルを作成して挙動を確認してみたいと思います。
<?php
class StaticNum
{
//staticプロパティ
public static $stNum = 0;
//通常のプロパティ
public $num = 0;
//プロパティに引数の値を加算するメソッド
public function count(int $plus)
{
//staticプロパティに加算
self::$stNum += $plus;
//通常プロパティに加算
$this->num += $plus;
}
}
//StaticNumbersインスタンスを2つ作成
$staticA = new StaticNum();
$staticB = new StaticNum();
//Aのcount()を引数5で実行
$staticA->count(5);
//Aのプロパティを出力
echo "AのstNum:" . $staticA::$stNum. "num:" . $staticA->num;
//Bのcount()を引数10で実行
$staticB->count(10);
//Bのプロパティを出力
echo "BのstNum: " . $staticB::$stNum . "num:" . $staticB->num;
//実行結果
AのstNum: 5 num: 5
BのstNum: 15 num: 10
上記の結果からわかるように、
本来ならばインスタンスを作成して実行すると、2つのプロパティそれぞれに5と10が別々に加算され、staticAのプロパティは5の値を持ち、staticBのプロパティ は10の値を持つはずであるが、public static $stNum = 0;
のようにstaticを使い、静的プロパティとすると、プロパティがクラスに属し、インスタンスからは独立して値を持つようになる。
結果として、インスタンスから見たクラスに属するプロパティ($stNum)
は1つである為、加算対象が$stNumのみとなり、5が加算された後に10も加算され、$stNumは15の値を持つこととなる。
いまいち使いどころがわからない
staticメソッドに関しては普通のメソッドと比較しても使い方がほとんど変わらず、、、。
アサーションメソッドをstatic宣言することで、 テストオブジェクトのスコープを超えた再利用を可能にする時に使うのだろうと勝手に思っています。
もしよろしければstaticはこのように使うべきだ等の知見がございましたら、コメントにてご教授いただきたく存じます。
よろしくお願い致します。
参考文献
PHP manual static キーワード
[PHP: 静的メソッドは何のためにあるか?Qiita]
(https://qiita.com/suin/items/0897adc7dc653b9c20de)