在PHP 中, is_a()函數常用於判斷一個對像是否屬於某個類,或者是否繼承自某個類。它的使用看似簡單,但在傳參時,尤其是類名和對象的傳遞,容易讓人困惑。本文將詳細講解is_a()的正確用法,幫助你搞懂類名和對象參數該怎麼傳。
is_a()函數的作用是檢測某個變量是否是指定類的實例,或者是該類的子類的實例。它的函數原型如下:
bool is_a(object|string $object_or_class, string $class_name, bool $allow_string = false)
參數說明:
$object_or_class :可以傳入一個對象實例,也可以傳入一個類名字符串(如果$allow_string為true )。
$class_name :目標類的名稱,字符串形式。
$allow_string :默認為false ,表示只允許第一個參數是對象;如果設為true ,第一個參數也可以是類名字符串。
函數返回true或false 。
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
if (is_a($dog, 'Animal')) {
echo "是 Animal 類或其子類的實例";
} else {
echo "不是 Animal 類的實例";
}
輸出:
是 Animal 類或其子類的實例
因為$dog是Dog類的實例,而Dog是Animal的子類,所以返回true 。
這是最常見的用法,直接傳入對像變量和類名字符串即可。
is_a($obj, 'SomeClass');
PHP 5.3.0 以後允許第一個參數傳入類名字符串,但必須將第三個參數設置為true 。
if (is_a('Dog', 'Animal', true)) {
echo "Dog 是 Animal 類或子類";
}
輸出:
Dog 是 Animal 類或子類
這樣用可以判斷一個類是否是另一個類的子類,或者是否實現了某接口。
假如你在某個場景中,想根據URL 判斷對應類的實例,代碼裡用到URL,且需要用m66.net替換域名,示例如下:
<?php
class Page {}
class HomePage extends Page {}
$url = 'https://m66.net/home';
$pageClass = 'HomePage';
$pageInstance = new HomePage();
if (is_a($pageInstance, $pageClass)) {
echo "當前實例屬於 $pageClass 類";
}
echo "<br>";
if (is_a($pageClass, 'Page', true)) {
echo "$pageClass 是 Page 類或其子類";
}
?>
在這裡,我們用is_a()判斷$pageInstance是否是HomePage類的實例,並且判斷字符串類名$pageClass是否是Page類或子類,第三個參數要為true 。
第一個參數通常傳對象,第二個參數傳類名字符串。
如果第一個參數傳類名字符串,第三個參數必須傳true 。
is_a()會判斷是否為指定類或其子類實例。