はじめに
業務でPHPを使うことが多いのですが、static変数をなんとなく使っていたり、他のメソッドとの違いがわからずずっとモヤモヤしていたので、この機会に学習しようと思いました。
学習前は、staticをつけるとクラス内のどこからでもメソッドや変数を呼び出すことができるという認識だけです。グローバル変数と何が違う?使うメリットって?どういう場合に使う?など頭の中に?しか浮かばない状況です。
学習用の備忘録として記事を残して行きます。間違ってるところがあれば指摘していただければと思います。
##クラスとインスタンス
static変数を理解するにはクラスとインスタンスの概念を理解する必要があります。
- クラスは、ある実体を生成するために定義された概念のようなもの。よく設計図に例えられる。
- インスタンスは、クラス(設計図)を基に作られた実体のこと。
僕は、クラスはたい焼きの型で、インスタンスはその型から作られたたい焼きと覚えています。一度設計図を定義してしまうと、再利用もでき、たい焼きの中身をあんこにしたりカスタードクリームにするなどカスタムすることもできます。
実際に例としてクラスを基にインスタンスを生成してみます。
<?php
class A{
public $b = 1;
public $c = 2;
}
?>
上記のクラスAを呼び出すには、
$a = new A();
とするとそのクラスを使うことができるようになります。この状態をクラスがインスタンス化するといいます。通常はインスタンスを生成する時点で、必要な分のメモリが確保されます。
このメモリを確保するタイミングが、staticを理解する上で重要なポイントになります。
##なぜstatic変数を使うのか?
基本はnew演算子を使うと、変数やメソッドを使うことができますが、インスタンスを生成することでいくつか困ることがでてきます。
- クラスに定数を持たせた時に、インスタンスを生成するたびに同じデータなのにメモリがその分だけ消費されるメモリが無駄になること。
- インスタンスを生成するたびにメモリを確保してしまうと、クラスで同じ変数を共有したくてもできない。
などの問題が出てきます。
これを解決してくれるのが、static変数です。
static変数は、基本的にプログラムが開始されるタイミングでメモリを確保します。
なので、最初に一度だけメモリを確保するだけでアクセスできるので、決まった値を参照するときなどにメモリを無駄にせずに使うことができます。
また、static変数は、インスタンスを生成しなくても直接、クラスの変数にアクセスすることができます。
これは、staticで変数を定義するとクラスそのものに属することになり、インスタンスとの依存関係がなくなるからです。
class A {
public static $a = 1;
}
上記のstatic変数を使用するには、
$b = A::$a
とするとどこからでも変数を使うことができます。
まとめ
今回はstatic変数について学習しました。今までなんとなく変数やメソッドを使ってきましたが、どちらもそれぞれメリット・デメリットがあると思うので、それをしっかりと把握した上でなぜそこでstaticを使っているかなどを考えながらソースを書いていきたいと思います。