【PHP】クラス(class)とは何か? – プロパティ・メソッドも合わせて初心者向けに解説

プログラミングにはクラス(class)と呼ばれる記法があります。

柔軟性のあるプログラムを作成するために、クラスはとても強力な手段になっております。

ここではクラスについて初心者向けに解説します。

★ 目的

  • クラスを理解する。
  • クラスを使えるようになる。

クラスとは

クラスは特定の単位でプログラムをまとめた定義のことです。

一般的なアプリケーション(プログラム)では、モノや事柄、概念などの人間が認識できる単位でクラスを複数作成し、それらを組み合わせて1つのアプリケーションを構築します。

クラスを用いたプログラムはとても奥が深く、全てを理解するにはアプリケーション設計やオブジェクト指向と呼ばれる考え方を知る必要がありますが、ここではプログラミングでのクラスの使い方について理解していきましょう。

インスタンスについて

クラスはプログラムをまとめた定義で、主に次の項目を含みます。

  • データ(どのようなデータを扱うか)
  • 処理(どのような処理を行うか)

そして、クラスから新しくプログラムをデータとして作成することができます。

作成したデータをインスタンスと呼び、クラスからデータを作成することをインスタンス化と呼びます。

イメージとしてはクラスは設計書、インスタンスは設計書を元に作られた実態です。

例えば、レシピを元にカレーを作ることをイメージしてください。このレシピが設計書(クラス)で、レシピを元に作られたカレーがインスタンスです。

クラスの理解するにあたり

クラスを理解するために、先ずはクラスを使用しない次のサンプルコードをご覧ください。

ソースコード

<?php

// 1人目
$person1_name = 'Watanabe You';
$person1_height = 157;
$person1_age = 16;

// 2人目
$person2_name = 'Nishikino Maki';
$person2_height = 161;
$person2_age = 15;

// 3人目
$person3_name = 'Tang keke';
$person3_height = 159;
$person3_age = 15;

// 1人目のプロフィールを出力
echo "===== プロフィール =====\n";
echo "名前 : ".$person1_name."\n";
echo "身長 : ".$person1_height."cm\n";
echo "年齢 : ".$person1_age."歳\n";

// 2人目のプロフィールを出力
echo "===== プロフィール =====\n";
echo "名前 : ".$person2_name."\n";
echo "身長 : ".$person2_height."cm\n";
echo "年齢 : ".$person2_age."歳\n";

// 3人目のプロフィールを出力
echo "===== プロフィール =====\n";
echo "名前 : ".$person3_name."\n";
echo "身長 : ".$person3_height."cm\n";
echo "年齢 : ".$person3_age."歳\n";

?>

実行結果

===== プロフィール =====
名前 : Watanabe You
身長 : 157cm
年齢 : 16歳
===== プロフィール =====
名前 : Nishikino Maki
身長 : 161cm
年齢 : 15歳
===== プロフィール =====
名前 : Tang keke
身長 : 159cm
年齢 : 15歳

これは3人のプロフィールデータ(名前、身長、年齢)を扱うプログラムです。

プロフィールデータを記憶するために、それぞれの変数を用意しており、そのデータを元にプロフィールを出力しています。

各人のプロフィールは名前、身長、年齢と同じで、プロフィールの出力処理も同じで、変数名だけが異なります。

もし、これが4人、5人・・・100人になったらどうでしょうか?

同じようなプログラムを多量作る必要があります。

そのようなときにクラスを使うとプログラムに柔軟性を持たせつつ、コンパクトに作ることができるようになります。

クラスの使い方

上記サンプルコードをクラスを用いて作成する過程を見ながら理解していきましょう。

1. クラスを定義する。

クラスの基本構文は次のようになります。

class クラス名 {
}

サンプルコードでは各人のデータが実態であり、インスタンスとしたいので、その設計書を人間クラスとして『Person』クラスを定義します。

ソースコード

<?php

// クラス定義
class Person {

}

?>

実行結果

この段階ではクラスを定義しただけなので、何も出力されません。

2. プロパティを定義する。

プロパティとはクラスの中に定義する変数のことです。

プロパティを含めたクラスの基本構文は次のようになります。

class クラス名 {
    アクセス修飾子 プロパティ変数1
    アクセス修飾子 プロパティ変数2
    ・・・・・・・・
}

プロパティは、クラス(インスタンス)でどのようなデータを扱うかを定義し、ここでは名前、身長、年齢を記憶する変数になります。

ソースコード

<?php

// クラス定義
class Person {
    
    // 名前
    public $name;
    
    // 身長
    public $height;
    
    // 年齢
    public $age;
    
}

?>

実行結果

こちらもまだ、クラスを定義しただけなので、何も出力されません。

なお、変数の前に記述されている『public』については、アクセス修飾子と呼ばれるものになります。こちらは別の機会で解説できればと思いますので、ここでは『プロパティにはpublicを付ける』と覚えておきましょう。

3. インスタンス化する。

インスタンス化(インスタンスを生成するともいう)の基本構文は次のようになります。

new クラス名();

Personクラスをインスタンス化する場合を見てみましょう。

ソースコード

<?php

// クラス定義
class Person {
    
    // 名前
    public $name;
    
    // 身長
    public $height;
    
    // 年齢
    public $age;
    
}

// インスタンス化(インスタンスの生成)
$watanabe = new Person();

// インスタンスの確認
echo gettype($watanabe)."\n";
echo get_class($watanabe)."\n";
var_dump($watanabe);

?>

実行結果

object
Person
object(Person)#1 (3) {
  ["name"]=>
  NULL
  ["height"]=>
  NULL
  ["age"]=>
  NULL
}

18行目の『new Person()』でインスタンス化し、その値を$watanabeという変数に代入しています。

インスタンス化されたデータは変数に記憶することができるため、代入・記憶については通常の整数型(int型)や文字列型(string)と同様に使うことが可能です。

21行目〜23行目は$watanabeにデータが入っているか確認するため、$watanabeの情報を出力しています。

出力で使われているgettype()、get_class()、var_dump()の3つの標準関数は次の役割をしています。

◆ gettype()

引数に渡したデータの型を文字列で返す。

◆ get_class()

引数に渡したデータのクラスを文字列で返す。

◆ var_dump()

データの詳細情報を出力する。

実行結果のgettype()の部分では『object』と出力されています。

これはオブジェクト型(object型)と呼ばれる型で、インスタンスなどの型を示します。

また、get_class()の部分では『Person』と出力されています。

これは$watanabeのインスタンスはPersonクラスであることを示しています。

var_dump()の部分では$watanabeの型、クラス名、プロパティを全て表示していることが分かります。

このようにインスタンス化することで、プログラム中で変数に代入して扱うことができるようになります。

4. プロパティにデータを記憶し、取得する。

インスタンスからプロパティにアクセスすることができます。

アクセスするにはアロー演算子(→)を用いて次のように記述します。

変数→プロパティ

Personクラスのインスタンスにデータを記憶し、取得する場合は次のようになります。

ソースコード

<?php

// クラス定義
class Person {
    
    // 名前
    public $name;
    
    // 身長
    public $height;
    
    // 年齢
    public $age;
    
}

// インスタンス化(インスタンスの生成)
$watanabe = new Person();

// インスタンスのプロパティにデータを記憶
$watanabe->name = 'Watanabe You';
$watanabe->height = 157;
$watanabe->age = 16;

// インスタンスのプロパティからデータを取得
echo "===== プロフィール =====\n";
echo "名前 : ".$watanabe->name."\n";
echo "身長 : ".$watanabe->height."cm\n";
echo "年齢 : ".$watanabe->age."歳\n";

?>

実行結果

===== プロフィール =====
名前 : Watanabe You
身長 : 157cm
年齢 : 16歳

21行目〜23行目でアロー演算子を使用し、各プロパティにデータを代入しています。

そして、26行目〜29行目で$watanabeの各プロパティからデータを取得し、プロフィール情報を出力しています。

5. インスタンスを複数作成する。

設計書であるPersonクラスを使用して複数のインスタンスを生成することができます。

先ほどのコードでは1名のみのインスタンス化でしたので、他2名もインスタンス化します。

ソースコード

<?php

// クラス定義
class Person {
    
    // 名前
    public $name;
    
    // 身長
    public $height;
    
    // 年齢
    public $age;
    
}

// インスタンス化(インスタンスの生成)
$watanabe = new Person();
// インスタンスのプロパティにデータを記憶
$watanabe->name = 'Watanabe You';
$watanabe->height = 157;
$watanabe->age = 16;

// インスタンス化(インスタンスの生成)
$nishikino = new Person();
// インスタンスのプロパティにデータを記憶
$nishikino->name = 'Nishikino Maki';
$nishikino->height = 161;
$nishikino->age = 15;

// インスタンス化(インスタンスの生成)
$tang = new Person();
// インスタンスのプロパティにデータを記憶
$tang->name = 'Tang keke';
$tang->height = 159;
$tang->age = 15;

// インスタンスのプロパティからデータを取得
echo "===== プロフィール =====\n";
echo "名前 : ".$watanabe->name."\n";
echo "身長 : ".$watanabe->height."cm\n";
echo "年齢 : ".$watanabe->age."歳\n";

// インスタンスのプロパティからデータを取得
echo "===== プロフィール =====\n";
echo "名前 : ".$nishikino->name."\n";
echo "身長 : ".$nishikino->height."cm\n";
echo "年齢 : ".$nishikino->age."歳\n";

// インスタンスのプロパティからデータを取得
echo "===== プロフィール =====\n";
echo "名前 : ".$tang->name."\n";
echo "身長 : ".$tang->height."cm\n";
echo "年齢 : ".$tang->age."歳\n";

?>

実行結果

===== プロフィール =====
名前 : Watanabe You
身長 : 157cm
年齢 : 16歳
===== プロフィール =====
名前 : Nishikino Maki
身長 : 161cm
年齢 : 15歳
===== プロフィール =====
名前 : Tang keke
身長 : 159cm
年齢 : 15歳

インスタンス化することで、インスタンスは固有のデータを記憶できるようになります。

そのため、同じクラスのインスタンスでもインスタンスが異なれば、プロパティに違い値を記憶することができます。

6. メソッドを定義する。

メソッドとはクラスの中に定義する関数のことです。

メソッドを含めたクラスの基本構文は次のようになります。

class クラス名 {
    アクセス修飾子 プロパティ変数
    アクセス修飾子 プロパティ変数
    ・・・・・・・・
    アクセス修飾子 function メソッド名1( 引数 ) {
        // 処理1
        // 処理2
        // ・・・・・・・
    }
    アクセス修飾子 function メソッド名2( 引数 ) {
        // 処理1
        // 処理2
        // ・・・・・・・
    }
    ・・・・・・・・
}

一般的にメソッドはクラスの中に記述された関数をメソッドと呼んでおり、記法はアクセス修飾子が付くこと以外は関数と同じです。

Personクラスにプロフィール情報を出力するメソッドを追加した場合、次のようになります。

ソースコード

<?php

// クラス定義
class Person {
    
    // 名前
    public $name;
    
    // 身長
    public $height;
    
    // 年齢
    public $age;
    
    // プロフィールを出力する
    public function profile() {
        echo "===== プロフィール =====\n";
        echo "名前 : ".$this->name."\n";
        echo "身長 : ".$this->height."cm\n";
        echo "年齢 : ".$this->age."歳\n";
    }

}

// インスタンス化(インスタンスの生成)
$watanabe = new Person();
// インスタンスのプロパティにデータを記憶
$watanabe->name = 'Watanabe You';
$watanabe->height = 157;
$watanabe->age = 16;

// インスタンス化(インスタンスの生成)
$nishikino = new Person();
// インスタンスのプロパティにデータを記憶
$nishikino->name = 'Nishikino Maki';
$nishikino->height = 161;
$nishikino->age = 15;

// インスタンス化(インスタンスの生成)
$tang = new Person();
// インスタンスのプロパティにデータを記憶
$tang->name = 'Tang keke';
$tang->height = 159;
$tang->age = 15;

?>

実行結果

16行目〜21行目がメソッドの定義です。

こちらはメソッドを定義しただけなので、何も出力されません。

7. メソッドを呼び出す。

メソッドは関数と同様に呼び出すことができ、次のように記述します。

変数->メソッド()

先ほどのprofileメソッドを呼び出す場合は次のようになります。

ソースコード

<?php

// クラス定義
class Person {
    
    // 名前
    public $name;
    
    // 身長
    public $height;
    
    // 年齢
    public $age;
    
    // プロフィールを出力する
    public function profile() {
        echo "===== プロフィール =====\n";
        echo "名前 : ".$this->name."\n";
        echo "身長 : ".$this->height."cm\n";
        echo "年齢 : ".$this->age."歳\n";
    }
    
}

// インスタンス化(インスタンスの生成)
$watanabe = new Person();
// インスタンスのプロパティにデータを記憶
$watanabe->name = 'Watanabe You';
$watanabe->height = 157;
$watanabe->age = 16;

// インスタンス化(インスタンスの生成)
$nishikino = new Person();
// インスタンスのプロパティにデータを記憶
$nishikino->name = 'Nishikino Maki';
$nishikino->height = 161;
$nishikino->age = 15;

// インスタンス化(インスタンスの生成)
$tang = new Person();
// インスタンスのプロパティにデータを記憶
$tang->name = 'Tang keke';
$tang->height = 159;
$tang->age = 15;

// プロフィールを出力する
$watanabe->profile();
$nishikino->profile();
$tang->profile();

?>

実行結果

===== プロフィール =====
名前 : Watanabe You
身長 : 157cm
年齢 : 16歳
===== プロフィール =====
名前 : Nishikino Maki
身長 : 161cm
年齢 : 15歳
===== プロフィール =====
名前 : Tang keke
身長 : 159cm
年齢 : 15歳

47行目〜49行目で各インスタンスのメソッドを呼び出しています。

呼び出しをすると関数と同じようにprofileメソッドが実行されますが、注目していただきたいのは$thisの部分です。

$thisは『自身のインスタンス』を指します。

つまり、$watanabe->profile()で実行される$this->heightは$watanabeのheightという意味になるため、157になり、

$nishikino->profile()で実行される$this->heightは$nishikinoのheightなので161となります。

8. コンストラクタを定義する。

コンストラクタとはインスタンス生成時に自動で呼び出されるメソッドで初期化メソッドとも呼ばれます。

コンストラクタを含めたクラスの基本構文は次のようになります。

class クラス名 {
    アクセス修飾子 プロパティ変数
    アクセス修飾子 プロパティ変数
    アクセス修飾子 function __construct( 引数 ) {
        // 初期化処理1
        // 初期化処理2
    }
    アクセス修飾子 function メソッド名1( 引数 ) {
        // 処理1
        // 処理2
        // ・・・・・・・
    }
    アクセス修飾子 function メソッド名2( 引数 ) {
        // 処理1
        // 処理2
        // ・・・・・・・
    }
    ・・・・・・・・
}

また、コンストラクタに引数がある場合はインスタンス生成時にデータを渡します。

new クラス名( 引数 )

先ほどのソースコードにコンストラクタを適用すると次のようになります。

ソースコード

<?php

// クラス定義
class Person {
    
    // 名前
    public $name;
    
    // 身長
    public $height;
    
    // 年齢
    public $age;
    
    // コンストラクタ
    public function __construct( $name, $height, $age ) {
        $this->name = $name;
        $this->height = $height;
        $this->age = $age;
    }
    
    // プロフィールを出力する
    public function profile() {
        echo "===== プロフィール =====\n";
        echo "名前 : ".$this->name."\n";
        echo "身長 : ".$this->height."cm\n";
        echo "年齢 : ".$this->age."歳\n";
    }
    
}

// インスタンス化(インスタンスの生成)
$watanabe = new Person('Watanabe You', 157, 16);
$nishikino = new Person('Nishikino Maki', 161, 15);
$tang = new Person('Tang keke', 159, 15);

// プロフィールを出力する
$watanabe->profile();
$nishikino->profile();
$tang->profile();

?>

実行結果

===== プロフィール =====
名前 : Watanabe You
身長 : 157cm
年齢 : 16歳
===== プロフィール =====
名前 : Nishikino Maki
身長 : 161cm
年齢 : 15歳
===== プロフィール =====
名前 : Tang keke
身長 : 159cm
年齢 : 15歳

15行目〜20行目にコンストラクタを追加し、33行目〜35行目のインスタンス生成で引数を渡すようになっています。

使い方のまとめ

以上がクラスの基本的な使い方になります。

最後のコードを見るととてもスマートになったことが分かります。

もし他のPersonクラスのインスタンスを増やすことがあっても、『インスタンスの生成』と『profileメソッドの呼び出し』の2行を追加するだけで良くなっており、プロフィールの出力形式に変更があれば、profileメソッドを修正するだけで、OKです。

まとめ

クラスは比較的複雑で覚えることが多い学習ポイントですが、非常に強力な要素です。

1度で使いこなすのは難しいかと思いますが、日頃からクラスを意識して、身につけていきましょう。