is_a

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

is_a检查对象是否为给定类型或子类型

描述

is_a(混合 $object_or_class, 字符串 $class, 布尔值 $allow_string = false): 布尔值

确定给定的 object_or_class 是否是 class 对象类型,或者是否具有 class 作为其超类型之一。

参数

object_or_class

类名或对象实例。

class

类名或接口名

allow_string

如果此参数设置为 false,则不允许使用字符串类名作为 object_or_class。这也阻止了在类不存在时调用自动加载器。

返回值

如果 object_or_classclass 对象类型,或者具有 class 作为其超类型之一,则返回 true,否则返回 false

范例

范例 #1 is_a() 示例

<?php
// 定义一个类
class WidgetFactory
{
var
$oink = 'moo';
}

// 创建一个新对象
$WF = new WidgetFactory();

if (
is_a($WF, 'WidgetFactory')) {
echo
"yes, \$WF is still a WidgetFactory\n";
}
?>

范例 #2 使用 instanceof 运算符

<?php
if ($WF instanceof WidgetFactory) {
echo
'Yes, $WF is a WidgetFactory';
}
?>

参见

添加说明

用户贡献的说明 7 个说明

Ronald Locke
7 年前
请注意,您必须在第二个参数中完全限定类名。

use 语句不会在 is_a() 函数中解析命名空间依赖关系。

<?php
namespace foo\bar;

class
A {};
class
B extends A {};
?>

<?php
namespace har\var;

use
foo\bar\A;
$foo = new foo\bar\B();

is_a($foo, 'A'); // 返回 false;
is_a($foo, 'foo\bar\A'); // 返回 true;
?>

只是在这里添加该说明,因为所有示例都没有命名空间。
Aron Budinszky
12 年前
小心!从 PHP 5.3.7 开始,is_a() 的行为略有变化:当使用不是对象的第一个参数调用 is_a() 时,将触发 __autoload()!

实际上,这意味着调用 is_a('23', 'User'); 将在 "23" 上触发 __autoload()。以前,上面的语句只是返回 'false'。

可以在此处找到更多信息
https://bugs.php.net/bug.php?id=55475

这种改变是否被认为是一个错误,以及它是否将在未来的版本中被恢复或保留,还有待确定,但无论如何,目前就是这样...
p dot scheit at zweipol dot net
17 年前
至少在 PHP 5.1.6 中,这也适用于接口。

<?php
interface test {
public function
A();
}

class
TestImplementor implements test {
public function
A () {
print
"A";
}
}

$testImpl = new TestImplementor();

var_dump(is_a($testImpl,'test'));
?>

将返回 true
SlimDeluxe
1 年前
对于任何想知道的人来说,这在特质中不起作用 :(
cesoid at yahoo dot com
18 年前
is_a 对类的子类的实例返回 TRUE。

例如

class Animal
{}

class Dog extends Animal
{}

$test = new Dog();

在这个例子中,is_a($test, "Animal") 将评估为 TRUE,is_a($test, "Dog") 也会评估为 TRUE。

这对我来说似乎很直观,但似乎没有记录下来。
dkrupyanskiy[at]gmail
6 年前
看起来描述中给出的函数签名是错误的。实际上,如果 $allow_string 设置为 true,它可以将字符串作为第一个参数。

花了一些时间才弄清楚最后一个参数应该如何使用。请考虑以下示例

<?php

class Foo{}

spl_autoload_register(
function(
$classname){
printf('autoload has been triggered for %s%s', $classname, PHP_EOL);
}
);

var_dump(is_a('UndefinedClassName', Foo::class, true));

?>
eitan at mosenkis dot net
12 年前
从 PHP 5.3.9 开始,is_a() 似乎在传递字符串作为第一个参数时返回 false。相反,使用 is_subclass_of(),如果您的目的需要,也检查两个参数是否相等,因为 is_subclass_of('foo', 'foo') 将返回 false,而 is_a('foo', 'foo') 以前返回 true。
To Top