📜  PHP的is_a()函数和 instanceof 有什么区别?(1)

📅  最后修改于: 2023-12-03 15:33:41.125000             🧑  作者: Mango

PHP的is_a()函数和 instanceof 有什么区别?

当我们需要判断一个对象是否属于某个类时,可以用PHP的is_a()函数和instanceof。它们的功能类似,但有一些区别。

is_a()函数

is_a()函数判断一个对象是否属于某个类或继承自该类。它的语法如下:

bool is_a ( object $object , string $class_name [, bool $allow_string = FALSE ] )
  • $object:要检查的对象,可以是类实例或对象。
  • $class_name:要检查的类名,可以是字符串或对象。
  • $allow_string:如果设为TRUE,则允许$class_name参数为字符串,否则只允许对象。

is_a()函数返回一个bool类型的值,表示$object是否属于$class_name。

示例代码:

class A {}
class B extends A {}
class C {}

$obj = new B();

var_dump(is_a($obj, 'A')); // 输出 bool(true)
var_dump(is_a($obj, 'B')); // 输出 bool(true)
var_dump(is_a($obj, 'C')); // 输出 bool(false)

上面的代码中,$obj是B的一个实例,is_a($obj, 'A')和is_a($obj, 'B')的返回值都是true,因为B继承自A;is_a($obj, 'C')的返回值是false,因为C和B没有任何关系。

instanceof

instanceof是一个二元运算符,用于判断一个对象是否是某个类或其子类的实例。它的语法如下:

bool instanceof ClassName

instanceof常用于对象类型的检查,返回一个bool类型的值,表示对象是否是对应类或其子类的实例。

示例代码:

class A {}
class B extends A {}
class C {}

$obj = new B();

var_dump($obj instanceof A); // 输出 bool(true)
var_dump($obj instanceof B); // 输出 bool(true)
var_dump($obj instanceof C); // 输出 bool(false)

这段代码和上面的is_a()函数的例子基本上一样,只不过使用了instanceof来替代is_a()函数,其结果是一样的。

区别

除了语法的不同,is_a()函数和instanceof还有以下区别:

  • 对于继承树中的抽象类或接口,is_a()函数返回false,而instanceof会把实现该抽象类或接口的类视为属于它们。

示例代码:

interface IA {}
class A implements IA {}
class B extends A {}

$obj1 = new A();
$obj2 = new B();

var_dump(is_a($obj1, 'IA')); // 输出 bool(false)
var_dump($obj1 instanceof IA); // 输出 bool(true)

var_dump(is_a($obj2, 'IA')); // 输出 bool(false)
var_dump($obj2 instanceof IA); // 输出 bool(true)
  • 对于null值,is_a()函数会返回false,而instanceof会出现一个Fatal error。

示例代码:

var_dump(is_a(null, 'A')); // 输出 bool(false)
var_dump(null instanceof A); // 报错:Fatal error: Uncaught Error: instanceof used on non-object
  • is_a()函数可以检查字符串和类名的关系,而instanceof只能检查对象和类名的关系。

示例代码:

var_dump(is_a('B', 'A')); // 输出 bool(false)
var_dump(is_a(new B(), 'A')); // 输出 bool(true)

var_dump('B' instanceof A); // 报错:Fatal error: instanceof expects an object instance, string given
var_dump(new B() instanceof 'A'); // 报错:Parse error: syntax error, unexpected ''A'' (T_CONSTANT_ENCAPSED_STRING)
总结

以上是is_a()函数和instanceof的区别,两者都可以用于判断一个对象是否属于某个类或继承自该类,但在一些特殊情况下会有所不同。需要根据实际情况来选择使用哪种方式。