۰ محمدجوکار
نکته‌آموزشی: یه استثنای جالب در ارث بری ونتیجه سوالاتی که در این بخش پرسیدم.
جامعه پی اچ پی ایجاد شده در ۰۹ بهمن ۱۴۰۱

مشکلاتی برام به وجود اومد، که بهتر دونستم در قالب یک نکته آموزشی بیام و این مسئله رو بیان کنم. شاید براتون جالب باشه.

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

راه حل درست هم، با استفاده از overriding یا Late Static Binding میتونه هندل بشه.

:

class A {
    private function foo() {
        echo 'hello parent' ;
    }
    
    public function test() {
        $this->foo();
    }
}
class B extends A {
    private function foo() {
        echo 'hello child' ;
    }
}
$b = new B();
$b->test();

در صورتی که بخوایم در مثال بالا از ارث بری استفاده بکنیم:

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

اگر کلا، نه در کلاس child و نه در کلاس parent، این متد وجود نداشته باشه، خب قطعا میگه همچین چیزی وجود نداره یا اصلا چیزی بر نمیگردونه.

حالا اگر متد foo درون کلاس پدر وجود داشته باشه و خصوصی هم باشه (مثل کلاس A در کدهای بالا) ، اتفاقات زیر میافته:

یک/ متد foo درون کلاس child وجود داره، که دو حالت به وجود میاد:

حالت اول: متد foo پابلیک باشه = محتویاتشو برمیگردونه.

حالت دوم: متد foo پابلیک نباشه = اگر متد foo هر چیزی به جز پابلیک باشه اونو برنمیگردونه و اینجا یه حالت استثنا به وجود میاد. که میره و متد foo پرایوت پدرش رو برمیگردونه.

دو/ متد foo درون کلاس child وجود نداره:

در این صورت خروجی، مجددا همون متد foo پدر هست.