PHP

【PHP】クラス変数とインスタンス変数についてまとめる

こんにちは、ともです。

PHPでクラスを書いた際に、「static」とつくものや「public」とつくものなど色々あります。

それらを正確に理解しないとクラスの設計はできないですよね。

この記事では、PHPでクラス変数とインスタンス変数についてまとめます。

クラス変数とインスタンス変数とは

まとめると次のような役割の違いです。

  • クラス変数・関数(クラス固有の変数・関数)- static
  • インスタンス変数・関数(インスタンス固有の変数・関数)- public

の4つがあり、その区別にstaticとpublicを利用ためのもの

クラス変数はクラス固有であり、インスタンス変数はインスタンス固有のものです。

クラス変数は、クラス固有なので、どのインスタンスから見ても常に同じ値です。

インスタンス変数は、インスタンス固有なので、インスタンス毎に固有の値を持っています。

クラスを定義する

次のような乗り物クラス(Vehicle)を作成し、最高速度を保存する変数としてstatic変数としてpublic static max_speed_spublic変数としてpublic max_speed_pを作成します。

<?php
   Class Vehicle {
      public max_speed_p = 150; //インスタンス変数
      public static max_speed_s  = 150;//クラス変数
      public function setMaxSpeed($speed) {
              $this->max_speed_p = $speed;
              self::max_speed_s = $speed;
      }
  }
<?php
   $car1 = new Vehicle;
   $car1->max_speed_p = 100;
   Vehicle::max_speed_s = 100;

またインスタンス変数とクラス変数をセットする関数として、setMaxSpeed関数を作成しました。

アクセスの方法を俯瞰するとこのようになります。

クラス内からインスタンス変数とクラス変数にアクセスする場合は次のようになります。

クラス内からのアクセス

  • $this->でインスタンス変数(public)にアクセス
  • self::でクラス変数(static)にアクセス

クラス外からのアクセス

  • $car1->でインスタンス変数(public)にアクセス
  • Vehicle::でクラス変数(static)にアクセス

よって、

  • アロー『$変数名->』でインスタンス変数にアクセスする
  • ダブルコロン『クラス名::』でクラス変数にアクセスする

ということがわかります。

クラス変数とインスタンス変数の使い分け

クラス変数は、そのクラスから生成されたインスタンス全てに影響する変数であることは前述しました。

そこで

  • 全てのインスタンスに共通する情報に関しはクラス変数(static)
  • インスタンス毎に固有の値を持たせたい場合はインスタンス変数(public)

という役割分担にします。

まとめ

static変数について理解をまとめました。

クラスに共通する変数を格納するものであり、『self』や『::』でアクセスすることがわかりました。

きっちりとクラスを設計できるようになりたいので、今後はクラス設計についても勉強したいと思います。