عملگر instanceof

عملگر instanceof در PHP، به شما اجازه می‌دهد که تست کنید که آیا یک شیء یک نمونه از یک نوع خاص (کلاس، زیر کلاس، …) است یا نه. عملگر instanceof به دو عملوند نیاز دارد و یک مقدار بولی را برمی گرداند. به عنوان مثال، فرض کنید یک کلاس به نام Animel داریم، سپس یک نمونه از آن ایجاد می‌کنیم :

 
<?php
    class Animal
    {
       
    }

    $myAnimal = new Animal();

    if ($myAnimal instanceof Animal)
    {
        echo "myAnimal is an Animal!" ;
    }            
?>
myAnimal is an Animal!

رفتار عملگر instanceof را در این مثال مشاهده کردید. همانطور که می‌بینید از آن به عنوان شرط در عبارت if استفاده شده است. کاربرد آن در مثال بالا این است که چک می‌کند که آیا شیء myAnimal یک نمونه از Animal است و چون نتیجه درست است کدهای داخل دستور if اجرا می‌شود. این عملگر همچنین می‌تواند چک کند که آیا یک شیء خاص در سلسله مراتب وراثت یک نوع خاص است. به این مثال توجه کنید :

<?php
    class Animal
    {
       
    }

    class Dog extends Animal
    {
    
    }

    $mydog = new Dog();

    if ($mydog instanceof Animal)
    {
        echo "myAnimal is an Animal!" ;
    }            
?>
myDog is an Animal!

همانطور که در مثال بالا می‌بینید ما یک کلاس به نام Dog ایجاد کرده‌ایم که از کلاس Animal ارث می‌برد. سپس یک نمونه از این کلاس (Dog) ایجاد می‌کنیم و سپس با استفاده از عملگر instanceof تست می‌کنیم که آیا نمونه ایجاد شده جز کلاس Animal است یا یک کلاس مشتق شده از کلاس Animal می‌باشد. از آنجاییکه کلاس Dog از کلاس Animal ارث می‌برد (سگ من یک حیوان است.)، نتیجه عبارت درست (true) است. حال جمله بالا را تغییر دهیم: ” حیوان من یک سگ است”. وقتی جمله برعکس می‌شود چه اتفاقی می افتد؟

$myAnimal = new Animal();

if ($myAnimal instanceof Dog)
{
    echo "myAnimal is a Dog!" ;
}

این باعث خطا نمی‌شود و عبارت فقط نتیجه false را بر می‌گرداند. می‌توان از کد بالا این را درک کرد که همه حیوانات سگ نیستند ولی همه سگها حیوان هستند. دستور if کد بالا را به صورت زیر هم می‌توان نوشت :

if (is_a($mydog, 'Animal'))
{
   echo "myAnimal is an Animal!" ;
}

همانطور که مشاهده می‌کنید به جای عملگر instanceof از متد ()is_a در کد بالا استفاده شده است. این متد همانند instanceof عمل می‌کند. یکی دیگر از روش‌های تشخیص نام کلاسی که یک شیء از آن مشتق شده است استفاده از متد ()get_Class است. به کد زیر توجه کنید :

<?php
    class Animal
    {
       
    }

    $myAnimal = new Animal();
    echo get_Class($myAnimal);
?>
Animal