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 則註釋

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

加上這段註釋是因為所有範例都沒有使用命名空間。
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

這個變更是否被視為錯誤,以及它是否會在未來版本中被還原或保留,還有待觀察,但無論如何,目前就是這樣...
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
2 年前
如果有任何人好奇,這不適用於 traits :(
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") 也會。

這對我來說很直觀,但似乎沒有被記錄下來。
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