PHPクラス編① 基本とインスタンスの仕組み

PHPのクラスの基本をポイントごとにまとめました。

クラスはオブジェクト指向プログラミングの重要な仕組みの一つで、関連するデータと動作をまとめて扱いやすくするためのものです。

この記事では具体的なコード例を使って、クラスの使い方を整理します。

目次

クラスの役割

クラスとは、変数や関数などプログラムをまとめた設計図のようなものです。

この設計図をもとに、何個でもインスタンス(オブジェクト)を作ることができます。

たとえば「車」というクラスを作っておけば、「赤い車」や「青い車」など、異なる状態を持った車のインスタンスをいくつでも生成できます。

クラスの書式

クラスは以下のような形式で定義し、処理に必要な「プロパティ(変数)」と「メソッド(関数)」を含めることができます。

// クラスを定義(クラス名は先頭を大文字にするのが慣例)
class Car {

  // プロパティの定義(クラス内で使う変数)
  public $color;
  public $speed;

  // メソッドの定義(クラス内で使う関数)
  public function drive() {
    echo "車を走らせます<br>";
  }

  public function stop() {
    echo "車を止めます<br>";
  }
}

プロパティとメソッドの総称を「メンバ」と呼び、先頭にアクセス修飾子(例:public)を付けて、メンバへのアクセス範囲を指定します。

アクセス修飾子意味
publicどこからでもアクセス可能
protectedクラス内、もしくは子クラスからアクセス可能
privateクラス内のみからアクセス可能

アクセス権を明示的に指定しない場合、 そのプロパティは「 public」 として定義されます。

クラスの使い方:インスタンスを生成する

定義したクラスを使うには、new クラス名()の書式でインスタンスを作成し、変数に代入します。
こうすることで、その変数を通じてクラス内の処理を利用できるようになります。

// インスタンスの生成
$car = new Car();

特殊なメソッド:コンストラクタ

「コンストラクタ」とは、インスタンス生成時に一度だけ自動で実行される特殊なメソッド(関数)です。

コンストラクタは__constructという名前で定義する決まりがあり、変数の初期値を設定したり、必要な処理をあらかじめ実行したりするために使います。

class Car {
  // コンストラクタ
  function __construct() {
    echo "インスタンス生成<br>";
  }
}

// インスタンスの生成(__constructが実行される)
$car = new Car();

この例でインスタンスを生成すると、自動的に「インスタンス生成」と表示されます。

クラスはファイル分割して読み込む

クラスは基本的に専用のファイルに分けて管理し、別ファイルからrequire_onceを使って読み込みます。

// クラスの定義
class Car {
  // 処理
}
// 外部ファイルの読み込み
require_once("car.php");

// インスタンスの生成
$car = new Car();

こうすることで、クラスを他のページでも再利用しやすくなります。

なお、この記事では解説の便宜上、クラスと実行処理を同じコード内に記述している場合もありますが、実際には別ファイルに分けて使うことを想定しています。

実装例

では、ここまでの基本をまとめた実装例を見てみましょう。

class Car {
  // カラーのプロパティ
  public $color;
  // スピードのプロパティ
  public $speed;

  // コンストラクタ
  public function __construct() {
    echo "車を作りました<br>";
  }

  // 走行メソッド
  public function drive() {
    echo "{$this->color}の車が時速{$this->speed}kmで走っています<br>";
  }

  // 停車メソッド
  public function stop() {
    echo "{$this->color}の車が止まりました<br>";
    $this->speed = 0;
  }
}
// 外部ファイルの読み込み
require_once("car.php");

// インスタンスの生成
$car = new Car();

// カラー、スピードの設定
$car->color = "赤";
$car->speed = 50;

// 自動車の走行と停車
$car->drive();
$car->stop();

実行結果

車を作りました
赤の車が時速50kmで走っています
赤の車が止まりました

解説:プロパティ操作とメソッドの実行方法

$car->color = "赤";
$car->speed = 50;

$car->drive();
$car->stop();

クラスの外からプロパティやメソッドにアクセスするには、アロー演算子->を使います。
※アロー演算子の後に書くプロパティ名やメソッド名に $は付けません。

class Car {
  // 走行メソッド
  public function drive() {
    echo "{$this->color}の車が時速{$this->speed}kmで走っています<br>";
  }
}

一方、クラスの中では$this->colorのように、$this(自分自身のインスタンスを表す擬似変数)を使ってアクセスします。

複数のインスタンス

1つのクラスから複数のインスタンスを生成する例です。

// インスタンス1:赤い車
$car1 = new Car();
$car1->color = "赤";
$car1->speed = 60;
$car1->drive();
$car1->stop();

// インスタンス2:青い車
$car2 = new Car();
$car2->color = "青";
$car2->speed = 80;
$car2->drive();
$car2->stop();

実行結果

車を作りました
赤の車が時速60kmで走っています
赤の車が止まりました
車を作りました
青の車が時速80kmで走っています
青の車が止まりました

引数とプロパティ

変更点

  • プロパティはprivate:外部から直接変更できないようにする(カプセル化)
  • コンストラクタに $colorを渡す:インスタンス生成時に色を設定
  • drive()$speedを渡す:速度を指定して走行開始
class Car {
  // カラーのプロパティ
  private $color;
  // スピードのプロパティ
  private $speed;

  // コンストラクタ
  public function __construct($color) {
    $this->color = $color;
    echo "「{$this->color}」の車を作りました<br>";
  }

  // 走行メソッド
  public function drive($speed) {
    $this->speed = $speed;
    echo "{$this->color}の車が時速{$this->speed}kmで走っています<br>";
  }

  // 停車メソッド
  public function stop() {
    echo "{$this->color}の車が止まりました<br>";
    $this->speed = 0;
  }
}
$car1 = new Car("赤");
$car1->drive(60);
$car1->stop();

実行結果

「赤」の車を作りました
赤の車が時速60kmで走っています
赤の車が止まりました

固定値はコンストラクタに渡し、可変値はメソッドに渡すのが、基本的な考えです。

クラスの基礎まとめ

ここまで紹介してきたメソッドやプロパティは、すべてインスタンスを生成して使う「インスタンスメンバ」と呼ばれるものです。

一方で、インスタンスを作らずに使える「静的メンバ(クラスメンバ)」という仕組みもあります。

そして、クラスの内部データを外部から直接操作できないようにし、安全に管理するための考え方が「カプセル化」です。

次回は、「カプセル化」と「静的メンバ」について詳しく見ていきます。

おすすめWEBスクール

WEB制作やWEBデザインを学びたいなら、SNSでも話題の「デイトラ」がおすすめ!
どのコースも10万円前後と業界最安値で、副業や転職に向けて十分なスキルを身につけることができます。

役に立ったら他の方にシェア

お気軽にコメントどうぞ

コメントする

目次