インスタンスのクラスを判断する – instanceof

各インスタンスが、どのクラスのものであるかを判断するには「instanceof」という演算子を使います。例えば次の例を見てみましょう。

// 商品管理クラス
class Item {
    public string $name;
}

// サービス管理クラス
class Service {
    public int $time;
}

$x = new Item();

この時、「$x」というインスタンスが Itemクラスであるかは次のように判定できます。

if ($x instanceof Item) {
    echo 'Itemクラスです';
}

Serviceクラスと比べた場合は falseになります。

if ($x instanceof Service) {
    echo 'Serviceクラスです';
}

これは例えば、パラメーターとしてあるクラスのインスタンスを期待しているときに、別のものが渡されるのを防ぐときなどに利用できます。例えば、ここでは買い物をするための「Cart」クラスを定義します。

class Cart {
    private array $items; // 商品の配列

    // 商品をカートに追加する
    public addCart($item): bool {
        $this->items[] = $item; // ここには Itemクラスのみが指定できる
        return true;
    }
}

この時、カートには Itemクラスのインスタンスだけを渡したいのですが、現状ではそれを判断することができません。そこで、「instanceof」を利用して次のように判断します。

    // 商品をカートに追加する
    public addCart($item): bool {
        if ($item instanceof Item) {
            $this->items[] = $item; // ここには Itemクラスのみが指定できる
            return true;
        }
        return false;
    }

これで、Itemクラスのインスタンスでない場合は無視されます。

完成プログラム

<?php
class Item {
public string $name;
}

class Book extends Item {
private int $page;
}

class Service {
private int $time;
}

class Cart {
private array $items = [];

public function add($item): bool {
if ($item instanceof Item) {
$this->items[] = $item; // ここには Itemクラスのみが指定できる
return true;
}
return false;
}
}

$item = new Item();
$item->name = 'PHP入門';

$service = new Service();

$cart = new Cart();
$cart->add($service);