PHPオブジェクト指向基礎

インスタンス

インスタンスとは

クラスの説明で述べたとおり、クラスとはオブジェクトの設計図と考えられます。
オブジェクトとしての基本的な性質を定義した設計図です。

設計図だけでは何も出来ないので、設計図をもとにした実体を作り出す必要があります。
この実体のことを「インスタンス」と呼びます。

オブジェクトの設計図が「クラス」
オブジェクトの実体は「インスタンス」
そしてインスタンスはクラスをもとに作られる。

インスタンスの生成

インスタンスの生成方法を見てみましょう。

<?php

$product = new Product();

?>

new」というキーワードが出てきました。これはクラスの実体を作り出すキーワードです。
「new クラス名()」でクラスのインスタンスが作られます。
もちろん、上記の場合であればProductという名前のクラスが事前に定義されていなければなりません。

そして作られたインスタンスは一旦、何か変数に入れて使用します。

上の例では「$product」という変数にProductクラスのインスタンスを入れました。

ここで言うと、Productクラスが商品の設計図なら、
$productは「商品そのもの」ということになります。

メンバへのアクセス

「フィールド」や「メソッド」などのクラスの構成要素を総称して「メンバ」と呼んでいます。

インスタンスは、クラスで定義されているメンバを持っています。
ここではインスタンスを使ってのメンバへのアクセスの仕方を見てみます。

<?php

// クラスを定義@
class Product
{
    private $name;  // 商品名
    private $price;   // 価格
    
    // 商品名を取得する
    public function getName()
    {
        return $this->name;
    }    
    
    // 商品名を設定する
    public function setName($name)
    {
        $this->name = $name;
    }    
}

// インスタンス生成
$product= new Product();

// 商品名を設定
$product->setName("かまぼこ");

// 商品名を取得
$productName = $product->getName();

var_dump($productName);

?>
string(6) "かまぼこ"

クラスで定義されているsetNameメソッドとgetNameメソッドを実行しています。
「$product->setName("かまぼこ")」でProductクラスのインスタンスの$nameフィールドに「かまぼこ」が保存されます。
その後「$product->getName()」でProductクラスのインスタンスの$nameフィールドに保存された値を取得して変数に格納しています。

インスタンスの性質

しつこいですが、クラスは設計図でインスタンスはその実体です。
ということは、設計図をもとに実体は複数作れるという考え方が出来ると思います。

車を例に考えましょう。車は自動車工場で作られますが、きっと設計図が存在するはずです。マーチならマーチの設計図があります。その設計図をもとに作られるマーチは無数にありますよね。

クラスとインスタンスの関係もこれに近いと考えられます。

<?php

class March
{
    private $mileage = 0; // 走行距離

    // 走行する
    public function drive($distance)
    {
        // 走った距離分、走行距離を加算
        $this->mileage += $distance;
    }

    // 走行距離を取得
    public function getMileage()
    {
        return $this->mileage;
    }
}

// 2台のマーチのインスタンスを生成
$march1 = new March();
$march2 = new March();

// マーチ1だけ走行してみる
$march1->drive(5);

// 両方のマーチの走行距離を取得する
$mileage1 = $march1->getMileage();
$mileage2 = $march2->getMileage();

print "マーチ1は" . $mileage1 . "km走りました
"
; print "マーチ2は" . $mileage2 . "km走りました
"
; ?>
マーチ1は5km走りました
マーチ2は0km走りました

マーチの図面が一つあります。
これをもとに2台のマーチが生産されました。
1台目だけ5km走行しました。
その後、2台のそれぞれの現在の走行距離を見ました。
当然1台目は5kmで2台目は0kmでした。
というようなストーリーです。


ここで言いたいことは、同じクラスをもとにしていても、生成される複数のインスタンス同士は全くかかわりがないと言うことです。もちろん、クラスが同じなので性質は同じです。しかし保持しているデータはインスタンス独自のものです。

この考え方は単純なようですが、オブジェクト指向の最大の特徴ではないかと思います。従来のプログラミング方式では、共通のグローバル関数を作ってもこういうことは出来ません。

つまりクラスの特徴は、クラスをもとにしたインスタンスはたくさん作ることができ、
その個々のインスタンスは完全に独立しているという事です。
だから同じクラスをもとに複数のインスタンスを生成しても、各インスタンスが保持しているデータはインスタンス独自であるという事です。
他のインスタンスへは一切影響を与えません。

世の中にたくさん存在するマーチは全部同じように見えるけど、
間違いなく個々のマーチですよね。

クラスとインスタンスの関係は1対1ではないのです。