با سلام و احترام
با تکیه بر سوالی که این دوستمون در زیر همین جلسه پرسیده بود، به یه ابهام برخوردم. داشتم اون ابهام رو حل میکردم، که شیشتا موضوع دیگه برام گنگ شد.. البته اینم بگم که این موضوعی که دارم مطرحش میکنم، با مسئله Late Static Binding کاملا حل میشه ولی خب چرایی این موضوع، خیلی برام جای سوال داره...
سوال دوستمون :
راستش پاسخی که آقای موحد داده بودند رو من نتونستم درک کنم. شاید همینم باعث شده که به ابهامات زیر، برخورد کنم:
وقتی ما به کلاس b میگیم که برو و متد test رو اجرا بکن، میره و متدی که از پدرش به ارث برده رو اجرا میکنه. بعد با توجه به این که خودش متد foo نداره، به اروری بر نمیخوره که این اولین سوال منه که چرا نباید به ارور بخوره؟؟؟ خب خودش که متد foo رو نداره!!! از اونطرف، این متد پرایوته و نمیشه که در کلاس b قابل دسترسی باشه...
این که بهش گفتیم اکستند کن، یعنی دقیقا کلاس b ما الان این شکلیه:
class B extends A { public function test() { $this->foo(); } }
دراین صورت، چطوری میتونه دسترسی داشته باشه به متد foo ؟
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
سوال بعدی:
حالا فرض میکنیم که کلاس b خودش دارای متد foo هست
ببینید، اینجا با توجه به اینکه ما متد foo رو داریم، بازم نمیاد از متد خودش استفاده کنه و همون متد پدرش رو برمیگردونه. در صورتی که ما میدونیم، آورراید، ارجعیت باید داشته باشه.
ابهام بعدی:
بازم جالبه، حتی اگه متد خودش رو پابلیک هم بکنیم، مجدد برامون همون متد پدرش رو برمیگردونه.
دیگه فقط حالتی میمونه که بخوایم سطح دسترسی متدی که در کلاس پرنت هست رو از پرایوت، به دو حالت دیگه تغییر بدیم که در این صورت، اجازه دسترسی رو دادیم دیگه...
اما چرا وقتی اجازه دسترسی داده نشده، اینطوری میره کد رو خراب میکنه؟؟؟ قائدتا باید انتظار ارور داشت اینجا...