🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ امیر صالحی
کاربرد instanceof چه است؟
محسن موحد حل شده توسط محسن موحد

سلام و احترام

من کاربرد دقیق instanceof رو متوجه نشدم، اگه امکانش هست با یک توضیحی راهنماییم کنید

سلام.

مفهومش و کاربردش سادس، میخواهیم بفهمیم یک آبجکت از نوع یک کلاس هست یا نه!

حین اجرای پروژه رو فرض کنید که میخواید بدونید داخل کدهاتون یک آبجکت از نوع یک کلاس ایجاد شده یا نه. (حالا چه از نوع ارث بری و چه از نوع پیاده سازی)

یه مثال روی Exception‌ها میارم:

فرض کنید ما چنتا کلاس Exception خودمون نوشتیم مثلا HttpException یا QueryException یا InvalidArgumentException یا ... و وقتی پروژه در زمان اجرا، Exception ای اتفاق میوفته، آبجکتی که داخل کد(e$) بهش دسترسی داریم، نمیدونیم در زمان اجرا، این آبجکت از نوع کدام کلاس هست، اینجا میایم چک میکنیم که اگر از نوع فلان کلاس بود یکسری کدها اجرا بشه و اگر ...

<?php
try {
} catch (\Exception $e) {
    if ($e instanceof HttpException) {
    	// todo
    } elseif (!$e instanceof ExitException) {
        throw $e;
    }
}

 

 

* البته تابع is_a رو هم داریم ولی ازونجایی که یک تابع هست، بار بیشتری ایجاد میکنه و کند عمل میکنه نسبت به instanceof

بهترین پاسخ
محسن موحد ۱۹ خرداد ۱۳۹۹، ۲۰:۳۷

سلام مطمئنم جواب کامل رو جناب موحد دادن ♥

اما من هم  یک سری برداشت‌ها داشتم که امیدوارم به درد بخوره

فکر میکنم اگر به جلسه دوم  php پیشرفته برگردیم  تو ی اون (هم افزایی) که  با همدیگه مثال از کلاسها و اشیاء زدیم،
میشه  اینطور به داستان نگاه کنیم :

اگر مثلا کلاس ما سیاره باشه و شی ما زمین

با " instanceof  " میشه بفهمیم که آیا این شی ما (زمین)  مربوط به کلاس ما ( سیاره )  هست یا نه!
که جواب ما رو   با بله و خیر میده.

<?php
//class
class person{ public $a=10;}
class student extends person{}
//object
$s=new student();
$p=new person();
//output
var_dump($p instanceof person);//output:bool(true)
var_dump($s instanceof student);//output:bool(true)
var_dump($p instanceof student);//output:bool(false)
var_dump($s instanceof person);//output:bool(true)


البته ما " is_subclass_of " رو هم داریم که کارکردش کمی متفاوته ، این یکی  همونطور که از اسمش پیداست فکر میکنم فقط دنبال کلاس‌های والد میگرده (کلاسی که ازش extends کردیم ) و اصلا کلاس اصلی رو در نظر نمیگیره.

<?php
//class
class person{ public $a=10;}
class student extends person{}
//object
$s=new student();
$p=new person();
//output
var_dump(is_subclass_of($s,'person'));//output:bool(true)
var_dump(is_subclass_of($p,'person'));//output:bool(false)
var_dump(is_subclass_of($s,'student'));//output:bool(false)

 

حسین سلطانیان ۲۳ خرداد ۱۳۹۹، ۲۱:۵۸