小编典典

is_a 和 instanceof 有什么区别?

all

我知道那instanceof是一个运算符,那is_a是一种方法。

该方法的性能是否较慢?你更喜欢用什么?


阅读 109

收藏
2022-06-14

共1个答案

小编典典

更新

PHP
5.3.9
开始, 的功能发生is_a()了变化。下面的原始答案声明is_a() 必须 接受 aObject作为第一个参数,但
PHP 版本 >= 5.3.9 现在接受可选的第三个布尔参数$allow_string(默认为false)以允许比较字符串类名:

class MyBaseClass {}
class MyExtendingClass extends MyBaseClass {}

// Original behavior, evaluates to false.
is_a(MyExtendingClass::class, MyBaseClass::class);

// New behavior, evaluates to true.
is_a(MyExtendingClass::class, MyBaseClass::class, true);

instanceof和之间的新行为的主要区别在于is_a()instanceof它将始终检查目标是指定类(包括扩展类)的实例化对象,而仅在参数设置为默认值is_a()时才要求实例化对象。$allow_string``false


原来的

实际上,is_a是一个函数,而是instanceof一个语言结构。
is_a会显着变慢(因为它具有执行函数调用的所有开销),但两种方法的总执行时间都很短。

从 5.3 开始,它不再被弃用,所以不用担心。

然而,有一个区别。 is_a作为一个函数,将一个对象作为参数 1,将一个字符串(变量、常量或文字)作为参数 2。所以:

is_a($object, $string); // <- Only way to call it

instanceof将对象作为参数 1,并且可以将类名(变量)、对象实例(变量)或类标识符(不带引号的类名)作为参数 2。

$object instanceof $string;      // <- string class name
$object instanceof $otherObject; // <- object instance
$object instanceof ClassName;    // <- identifier for the class
2022-06-14