在项目开发中,为了程序的严谨安全,我们必须对对象进行检测,这边介绍几种检测对象的方法.

以鸟类为示例:

<?php 
class Bird {

		public function say()
		{
				echo 'my is Bird';
		}
}

class Sparrow extends Bird {

		public function say()
		{
				echo 'my is sparrow'."<br>";
		}
}

class Phoenix extends Bird {

		public function say()
		{
				echo 'my is phoenix'."<br>";
		}
}

在这个示例中,我们申明了一个父类Bird,Sparrow和Phoenix都继承于Bird类.

下面我们看下检测对象的方法:

使用is_a()函数

代码示例:

$sparrow = new Sparrow;

$phoenix = new Phoenix;

if (is_a($sparrow,'Bird')) {
		$sparrow->say();
}

if (is_a($sparrow,'Sparrow')) {
		$sparrow->say();
}

var_dump(is_a($sparrow,'Bird'));
var_dump(is_a($sparrow,'Sparrow'));

结果:

my is sparrow
my is sparrow
boolean true
boolean true

由结果我们可以看出:is_a函数的作用就是 检测对象是否属于该类或该类是此对象的父类,是则返回 TRUE

使用get_class()函数

代码示例:

$sparrow = new Sparrow;

$phoenix = new Phoenix;

if (get_class($phoenix) == 'Phoenix') {
		$phoenix->say();
}

if (get_class($phoenix) == 'Bird') {
		$phoenix->say();
}

var_dump(get_class($phoenix));

结果:

my is phoenix
string 'Phoenix' (length=7)

由结果可以看出:get_class()函数是返回对象的类名,这方法只能检测对象所属的类,无法检测对象的父类

类似的方法还有:

* get_parent_class() -- 返回对象或类的父类名,get_parent_class(),参数为对象,返回对象的父类类名,参数若为字符串则返回以此字符串为名的类的父类名
*  is_subclass_of() -- 如果此对象是该类的子类,则返回 TRUE
get_parent_class()示例:
$sparrow = new Sparrow;

$phoenix = new Phoenix;


if (get_parent_class($sparrow) == 'Bird') {
		$sparrow->say();
}

if (get_parent_class('Sparrow') == 'Bird') {
		$sparrow->say();
}

结果:

my is sparrow
my is sparrow
is_subclass_of()示例
$sparrow = new Sparrow;

$phoenix = new Phoenix;

if (is_subclass_of($sparrow,'Bird')) {
		$sparrow->say();
}

结果:

my is sparrow

使用instanceof 关键字

instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例,结果为布尔值

代码示例:

$sparrow = new Sparrow;

$phoenix = new Phoenix;



if ($sparrow instanceof Bird) {
		$sparrow->say();
}

if ($sparrow instanceof Sparrow) {
		$sparrow->say();
}

结果:

my is sparrow
my is sparrow

结果可以看出,instanceof 可以用于检测变量是否是属于类,父类或者子类都可以检测.

除此之外,instanceof也可用于确定一个变量是不是实现了某个接口的对象的实例.

示例:

<?php

interface BirdInterface {
		public function hasWing();
} 
class Bird implements BirdInterface {

		public function hasWing()
		{
				echo 'I has wing';
		}

		public function say()
		{
				echo 'my is Bird';
		}
}

$bird = new Bird;

if ($bird instanceof BirdInterface) {
		$bird->say();
		$bird->hasWing();
}

结果:

my is BirdI has wing

g