型別運算子(Type Operator)
型別運算子是基於物件導向而生的,如果新手看不懂可以先略過,等講到物件導向的部分再回來看
型別運算子使用的語法不是符號,而是instanceof
instanceof
是用來判斷變數是否屬於某個類別 (class) 、繼承自某父類別 (parent class) 、實作某介面 (interface)
變數如果繼承自某個類別(class)或實作於某個介面(Interface),判斷結果會回傳true
另外,除了使用類別(class)名稱或是介面(interface)名稱以外,還可使用另一個物件或字串來判斷
<?php
class ParentClass {}
class ChildClass1 extends ParentClass {}
interface TheInterface {}
class ChildClass2 implements TheInterface {}
$child1 = new ChildClass1();
$child2 = new ChildClass2();
var_dump($child1 instanceof ChildClass1); // bool(true)
var_dump($child1 instanceof ChildClass2); // bool(false)
var_dump($child1 instanceof ParentClass); // bool(true)
var_dump($child1 instanceof NoClass); // bool(false),NoClass這個類別不存在,所以回傳false
var_dump($child2 instanceof ChildClass2); // bool(true)
var_dump($child2 instanceof TheInterface); // bool(true)
$x = new ChildClass1();
$childClassname = 'ChildClass1';
var_dump($child1 instanceof $x); // bool(true),相同類別
var_dump($child1 instanceof $childClassname); // bool(true),直接用類別名稱字串也可以
?>
而除了使用instanceof
外,PHP也提供了is_a()
函數來達到一樣的效果
但is_a()
的限制是最後一個傳入的參數要是類別名稱字串,不能直接用類別名稱
<?php
class TheClass {}
$theClass = new TheClass;
var_dump(is_a($theClass, 'TheClass')); // bool(true)
?>