PHP中instanceof关键字
instanceof关键字是PHP5新增的新成员。在一些情况下,我们希望确定某个类属于哪种特定的类型、或者是否实现了特定的接口,这时我们就可以使用这个关键字确定一个对象是否是某个特定的类型,是否是从某个特定的类型继承以及它或它的任何祖先类是否实现了特定的接口。
例如,假设希望了解名为test的对象是否为类Test的实例:
1 <?php 2 3 class Test{} 4 $test = new Test(); 5 if ($test instanceof Test) { 6 echo "Yes"; 7 }else{ 8 echo "No"; 9
instanceof关键字在同时处理多个对象是特别有用。例如,你可能要重复地调用某一个函数,希望根据对象类型调整函数的行为。可以使用case语句和instanceof关键字实现这个目标。
1 <?php 2 header("Content-type:text/html;charset=utf8"); 3 4 class Test{} 5 class testChilern Extends Test{} 6 $a = new Test(); 7 $m = new Test(); 8 if($m instanceof Test) 9 echo '$m是类Test的实例!<br />'; 10 switch ($a instanceof Test){ 11 case true : 12 echo 'YES <br />'; 13 break; 14 case false : 15 echo 'No <br />'; 16 break; 17 } 18 $d = new testChilern(); 19 if($d instanceof Test) 20 echo '$d是类Test的子类!<br />';
我们还可以使用instanceof关键字判断一个对象是否实现了某一个接口
1 <?php 2 header("Content-type:text/html;charset=utf8"); 3 4 interface ExampleInterface 5 { 6 public function interfaceMethod(); 7 } 8 class ExampleClass implements ExampleInterface 9 { 10 public function interfaceMethod() 11 { 12 return 'Hello World!'; 13 } 14 } 15 $exampleInstance = new ExampleClass(); 16 if($exampleInstance instanceof ExampleInterface){ 17 echo 'Yes, it is'; 18 }else{ 19 echo 'No, it is not'; 20 }
另外,需注意 instanceof 与 is_subclass_of() 的区别,请看代码:
1 <?php 2 header("Content-type:text/html;charset=utf8"); 3 4 class Foo { 5 public $foobar = 'Foo'; 6 public function test() { 7 echo $this->foobar . "\n"; 8 } 9 } 10 class Bar extends Foo { 11 public $foobar = 'Bar'; 12 } 13 $a = new Foo(); 14 $b = new Bar(); 15 echo "use of test() method\n"; 16 $a->test(); 17 $b->test(); 18 echo "instanceof Foo\n"; 19 var_dump($a instanceof Foo); // TRUE 20 var_dump($b instanceof Foo); // TRUE 21 echo "instanceof Bar\n"; 22 var_dump($a instanceof Bar); // FALSE 23 var_dump($b instanceof Bar); // TRUE 24 echo "subclass of Foo\n"; 25 var_dump(is_subclass_of($a, 'Foo')); // FALSE 26 var_dump(is_subclass_of($b, 'Foo')); // TRUE 27 echo "subclass of Bar\n"; 28 var_dump(is_subclass_of($a, 'Bar')); // FALSE 29 var_dump(is_subclass_of($b, 'Bar')); // FALSE
is_subclass_of 的作用就是判断一个对象是否是该类的子类,是则返回 TRUE。