PHP Conference Japan 2024

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 仍然是 WidgetFactory\n";
}
?>

示例 #2 使用 instanceof 运算符

<?php
if ($WF instanceof WidgetFactory) {
echo
'Yes, $WF 是一个 WidgetFactory';
}
?>

参见

添加注释

用户贡献的注释 7 条注释

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

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;
?>

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

在实践中,这意味着调用 is_a('23', 'User'); 将在“23”上触发 __autoload()。以前,上述语句只是返回“false”。

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

此更改是否被视为错误以及它是否会在将来的版本中被恢复或保留还有待确定,但无论如何,目前就是这样……
18
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
4
SlimDeluxe
2 年前
对于任何想知道的人,这在 trait 中不起作用 :(
11
cesoid at yahoo dot com
19 年前
is_a 对类的子类的实例返回 TRUE。

例如

class Animal
{}

class Dog extends Animal
{}

$test = new Dog();

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

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

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

<?php

class Foo{}

spl_autoload_register(
function(
$classname){
printf('autoload 已触发,类名为 %s%s', $classname, PHP_EOL);
}
);

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

?>
2
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