۵ محمدجوکار
ابهام در رابطه با ارث بری و Late Static Binding
جامعه پی اچ پی ایجاد شده در ۰۹ بهمن ۱۴۰۱

با سلام و احترام

با تکیه بر سوالی که این دوستمون در زیر همین جلسه پرسیده بود، به یه ابهام برخوردم. داشتم اون ابهام رو حل میکردم، که شیشتا موضوع دیگه برام گنگ شد.. البته اینم بگم که این موضوعی که دارم مطرحش میکنم، با مسئله Late Static Binding کاملا حل میشه ولی خب چرایی این موضوع، خیلی برام جای سوال داره...

سوال دوستمون :

16da-Screenshot (661).png

راستش پاسخی که آقای موحد داده بودند رو من نتونستم درک کنم. شاید همینم باعث شده که به ابهامات زیر، برخورد کنم:

1d6f-Screenshot (660).png

وقتی ما به کلاس b میگیم که برو و متد test رو اجرا بکن، میره و متدی که از پدرش به ارث برده رو اجرا میکنه. بعد با توجه به این که خودش متد foo نداره، به اروری بر نمیخوره که این اولین سوال منه که چرا نباید به ارور بخوره؟؟؟ خب خودش که متد foo رو نداره!!!‌ از اونطرف، این متد پرایوته و نمیشه که در کلاس b قابل دسترسی باشه...

این که بهش گفتیم اکستند کن، یعنی دقیقا کلاس b ما الان این شکلیه:

class B extends A {
    public function test() {
        $this->foo();
    }
}

دراین صورت، چطوری میتونه دسترسی داشته باشه به متد foo ؟

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سوال بعدی:

حالا فرض میکنیم که کلاس b خودش دارای متد foo هست

e0a4-Screenshot (662).png

ببینید، اینجا با توجه به اینکه ما متد foo رو داریم، بازم نمیاد از متد خودش استفاده کنه و همون متد پدرش رو برمیگردونه. در صورتی که ما میدونیم، آورراید، ارجعیت باید داشته باشه.

ابهام بعدی:

بازم جالبه، حتی اگه متد خودش رو پابلیک هم بکنیم، مجدد برامون همون متد پدرش رو برمیگردونه.

1d80-Screenshot (663).png

دیگه فقط حالتی میمونه که بخوایم سطح دسترسی متدی که در کلاس پرنت هست رو از پرایوت، به دو حالت دیگه تغییر بدیم که در این صورت، اجازه دسترسی رو دادیم دیگه...

اما چرا وقتی اجازه دسترسی داده نشده، اینطوری میره کد رو خراب میکنه؟؟؟ قائدتا باید انتظار ارور داشت اینجا...

سلام محمد عزیز

زمانی که شما کلاس والد رو اکستند میکنی همه متدها براش اعمال میشه ولی سطح دسترسی اونهارو محدود میکنه.

شما زمانی که متد تست رو صدا میزنی میره و اژ والد گرفته میشه چون شما متد تست رو توی والد قرار دادی و داخل متد اومدی متد foo رو تز همون والد میگیری.

احمدرضا فاطمی کیا ۰۹ بهمن ۱۴۰۱، ۱۲:۳۳

اینکه سطح دسترسی محدود میشه یعنی چی؟؟؟؟


نکته دومتون:

خب آره من متد‌ها رو دارم از پدر اکستند میکنم. و بهش میگم برو متد تست رو برگردون.

حالا توی متد تست، میگه محتویات متد foo باید برگردونده بشه

ولی چرا متد foo مربوط به خود کلاس فرزند رو برنمیگردونه؟؟؟ یا وقتی اصلا متدی نداره، چرا به ارور نمیخوره؟؟؟

محمدجوکار ۰۹ بهمن ۱۴۰۱، ۱۷:۳۰

یعنی به متد ما توی تایپ که مشخص میشه دسترسی پیدا میشه.

زمانی که شما private قرار میدید متد رو توی فانکشن مورد رو از والد میگیره چون فرض میکنه که توی فرزند نیست.

اما وی سایر تایپ‌ها (پابلیک و پروتکتد) اینطور نیست.

احمدرضا فاطمی کیا ۰۹ بهمن ۱۴۰۱، ۱۸:۵۹

راستش بازم نفهمیدم محدود شدن سطح دسترسی یعنی چی؟


اینکه میگید میره از پدرش میخونه!!

خب ببینید ما قبلا گفته بودیم که توی یه کلاس، اگر متدی یا پراپرتی به صورت پرایویت بود، میتونیم با استفاده از متدهای پابلیک، به اونها دسترسی داشته باشیم

حالا قراره همین کارو بکینم. فقط داریم اون متد پابلیک رو، از پدرش به ارث میبریم و نمیخوایم آور رایدش بکنیم.

در حقیقت این دوتا عکس زیر، نباید تفاوتی با هم داشته باشن. با این وجود که من فکر میکنم تفاوتی ندارن، ولی عملکرد متفاوتی رو دارند. که همین باعث میشه من سردرگم بشم.

اگه میشه توضیح بدید اون منطقی که اجازه نمیده کدهای زیر عملکرد یکسانی داشته باشند، چی هستش؟؟؟

1f3a-Screenshot (671).png


aeaf-Screenshot (670).png

محمدجوکار ۰۹ بهمن ۱۴۰۱، ۱۹:۱۵

چون در قالب متن ارائه برای درک کامل ممکن نبود.

توضیحات تکمیلی در قالب وویس خدمتت ارائه شد.

بهترین پاسخ
احمدرضا فاطمی کیا ۰۹ بهمن ۱۴۰۱، ۱۹:۱۹