PHP - OOP - 1. クラスとインスタンス

オブジェクト指向プログラミングとは、ソフトウェアを部品化して効率よく開発する手法です。この部品化する単位をクラスと呼び、クラスを実体化したものをインスタンスと呼びます。

オブジェクト指向プログラミングにおけるクラスとは「型」や「分類」、「概念」と言った意味合いを持ちます。これまでにプログラムのデータ型として、整数型( int )や文字列型( string )といったものを学習しましたが、これから学習するクラスも同じようにデータ型として利用できます。

クラスについてもう少し具体的に見ていきましょう。PHPプログラミングにおけるクラスとは、関係性のある変数(プロパティ)と関数(メソッド)をまとめて定義したものです。これまでに学習してきた変数や関数を組み合わせて1つのクラスを作成します。

オブジェクト

それからオブジェクトという用語についても触れておきましょう。少し聞き慣れない言葉に感じるかもしれませんが、オブジェクトという単語は、直訳すると「モノ」という意味になります。オブジェクトとは最も抽象的な意味合い持つ言葉で、現実世界に存在するものはすべてオブジェクトとして捉えることができます。つまり手元にあるパソコンやスマートフォン机もオブジェクトと言えますし、ここで学習しているクラスやそれを実体化したインスタンスもオブジェクトと言えます。

  • オブジェクト(モノ)
    • クラス(型、分類、概念)
    • インスタンス(概念を実体化したもの)
    • パソコン
    • スマートフォン
    • 時計
    • 時間
    • 音楽
    • ...

オブジェクトという言葉には「対象」という意味もあります。英語の勉強の中でもSVOC(第4文型)がありましたg、このOもObjectを意味しています。つまりこれから学習するオブジェクト(インスタンス)とは目的語のように、対象として指差しをして操作するかたちになります。

ソフトウェア開発の現場では、クラスから生成したインスタンスのことを単純にオブジェクトと呼ぶこともあります。本講座では以降、クラスとインスタンスという呼び方で解説を進めていくことにします。

クラスの記述

PHPプログラミングに話題を戻しましょう。PHPにおいてクラスを作成するには class キーワードを使います。

class クラス名
{
  // プロパティやメソッドを記述する
}

クラス名は先頭を大文字にしたキャメルケースで記述することが一般的です。たとえば MyClass という名前のクラスを作成するのであれば次のように作成します。

<?php
class MyClass
{

}

ファイル名には任意の名前を付けることができます。ここではクラス名とファイル名は同じにしておきましょう。 MyClass.php という名前で保存しておきます。

クラスの利用( new 演算子)

一般的にクラスとはソフトウェアを構成する部品のような位置づけになります。そのためクラスを利用して目的を達成するプログラムを別途作成することになります。プログラムの中から先ほどの MyClass クラスを利用するには new キーワードによってインスタンス化するようにします。次のファイルを my_class_runner.php という名前で作成します。

<?php
require_once("MyClass.php");

$myClass1 = new MyClass();
$myClass2 = new MyClass();

var_dump($myClass1);
var_dump($myClass2);

さきほどインスタンスとはクラスを実体化したもの、と説明しましたが、例えるなら、クラスとはコンピュータのメモリの中に作り上げた設計図のようなもので、その設計図のもとに作成した(実体化した)ものをインスタンスと考えると良いでしょう。

さきほどのプログラムでは new 演算子を使って2つの MyClass 型のインスタンスを生成しています。

$myClass1 = new MyClass();
$myClass2 = new MyClass();

このとき変数 $myClass1$myClass2 にはインスタンスそのものが直接代入されるのではなくインスタンスの参照というものが代入されます。この参照とはインスタンスがメモリ上のどこに存在するのかを示す位置情報のようなものです。インスタンスの参照を変数に代入することで、複数の変数から同一のインスタンスを参照することもできます。

それではターミナルからプログラムを実行してみましょう。

$ php my_class_runner.php
object(MyClass)#1 (0) {
}
object(MyClass)#2 (0) {
}

クラスから生成されたインスタンス(オブジェクト)を var_dump 関数で出力すると object(MyClass) という表記が確認できます。

現時点では {} の中身が空となっていますが、後ほど学習するプロパティ(クラスの中の変数)などはこの {} の中に出力されます。

PHPプログラムの開発(SimpleCalcクラス)

それではもう少し身近なものを題材にしてオブジェクト指向プログラミングを学んでいくことにしましょう。ここからは簡単な計算機プログラムを例に考えていくことにします。

ここではPHPを使って簡単な計算機クラス( SimpleCalc.php )を作成します。また作成した SimpleCalc クラスをインスタンス化して計算機を動かすためのプログラム( calc_runner.php )も合わせて作成します。

まずは次のように簡単な計算機クラス( SimpleCalc.php )を作成してみましょう。

<?php
class SimpleCalc
{
}

ここでは class キーワードを使って SimpleCalc という名前のクラスを定義しています。クラスの {} の中にはプロパティやメソッドといったものを定義できるのですが、ここではそのままにしておきましょう。

続いて SimpleCalc クラスのインスタンスを生成するプログラム calc_runner.php ファイルを作成します。

<?php
require_once("SimpleCalc.php");

$calc = new SimpleCalc();

var_dump($calc);

このプログラムでは先頭部分で require_once 関数を使って SimpleCalc.php ファイルを参照しています。これによって後のプログラムの中で SimpleCalc クラスを利用できるようになります。

次に new 演算子を使って SimpleCalc クラスのインスタンスを生成しています。

$calc = new SimpleCalc();

$calc 変数には SimpleCalc クラスのインスタンスの参照が代入されます。ここでいう参照とは、インスタンスがメモリ上のどこにあるのかを示す情報です。その後 var_dump 関数を使って $calc 変数の内容を出力しています。一般的に、作成したクラス( SimpleCalc クラス)は単体で動かすものではありません。他のプログラム(この場合 calc_runner.php )の中から new 演算子によってインスタンス化して利用します。

それではターミナルからプログラムを実行してみましょう。

$ php calc_runner.php
object(SimpleCalc)#1 (0) {
}

実行結果を見ると var_dump 関数によって object(SimpleCalc) と表示されているのがわかります。これは SimpleCalc クラスのオブジェクト(インスタンス)ということを意味します。

PHPプログラムの開発(複数のインスタンスを生成する)

さきほどのプログラム( calc_runner.php )を修正して、 SimpleCalc クラスのインスタンスを2つ生成してみましょう。

<?php
require_once("SimpleCalc.php");

$calc = new SimpleCalc();
$calc2 = new SimpleCalc();

var_dump($calc);
var_dump($calc2);

以下の図に示すように new 演算子によって1つのクラスから複数のインスタンスを生成できます。

実際にはメモリ上に2つの SimpleCalc インスタンス用の領域が確保されます。

それではターミナルからプログラムを実行してみましょう。

$ php calc_runner.php
object(SimpleCalc)#1 (0) {
}
object(SimpleCalc)#2 (0) {
}

実行結果から var_dump 関数によって2つの SimpleCalc クラスのインスタンスが表示されているのがわかります。またインスタンスごとに object(SimpleCalc)#1object(SimpleCalc)#2 のように番号が出力されています。これらの番号はメモリ上のインスタンスごとに異なる固有の番号で、2つは異なるインスタンスであること示しています。

まとめ

  • クラスとは関係性のある変数(プロパティ)と関数(メソッド)をまとめて定義したもの
  • クラスを定義するときには class キーワードを使う
  • new 演算子によってクラスからインスタンス(クラスを実体化したモノ)を生成できる