各インスタンスが、どのクラスのものであるかを判断するには「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);