روز برنامه‌نویس مبارک 🤩🎉 از هدایای روز برنامه‌نویس جا نمونی ⌛
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ کیان سلگی
ابهام در مورد مثال static در داکیومنت php
جامعه پی اچ پی ایجاد شده در ۲۶ بهمن ۱۴۰۰

سلام وقت بخیر

داخل سوالات مربوط به این جلسه یکی از دوستان دقیقا همین سوال رو مطرح کردند اما این سوال برای بنده هنوز ابهام داره


class A {
    private function foo() {
        echo "success!n
"
;     }     public function test() {         $this->foo();         static::foo();     } } class B extends A {    /* foo() will be copied to B, hence its scope will still be A and     * the call be successful */ } class C extends A {     private function foo() {         /* original method is replaced; the scope of the new one is C */     } } $b = new B(); $b->test(); $c = new C();

انتهای برنامه اومده که یک متغیر تعریف کرده به اسم b و گفته که یک نمونه شی هست از کلاس b . یعنی تمام اعضای public و protected کلاس a رو داره چون کلاس b کلاس a رو ارث بری کرده.

در خط بعد اومده گفته از آبجکت b متد test رو صدا زده.

حالا میریم داخل متد test

خب متد test داخل کلاس b وجود نداره و اون رو از a که پدرش هست ارث بری کرده پس رسیدیم به متد test که داخل کلاس a هست.

حالا داخل کلاس a خط اول متد test گفته شده که

$this->foo();

خب این یعنی از داخل اون آبجکتی که ساخته شده متد foo رو صدا بزن و این متد از آبجکت b ساخته شده و آبجکت b هم یک نمونه از کلاس b هست و کلاس b متد foo رو نداره و به ارث نبرده چون pivate بوه . پس ینی تا همین جا باید به خطا بخوریم ولی خروجی به خطا نمیخوره.

و این که در صورت امکان تمام نکات و عملکرد این کد رو توضیح بدید.

خیلی ممنون

سلام.

طراحی زبان php به این شکله که با توجه به اسکوپی که قرار داره اگر متد مد نظر private یا final باشه داخل همون اسکوپ بصورت مستقیم call میشن در غیر اینصورت متد فرزند:

class A {
        public function foo() {
            echo "A!";
        }
        public function test() {
            $this->foo();
        }
 }
class C extends A {
       public function foo() {
            echo 'C!';
       }
}
$c = new C();
$c->test(); 
بهترین پاسخ
محسن موحد ۲۶ بهمن ۱۴۰۰، ۲۱:۴۸