ابهام در مورد مثال

پرسیده شده
فعالیت 952 روز پیش
دیده شده 363 بار
0

سلام و عرض ادب
در داکیومنت php یک مثالی در این خصوص زده به این شکل :

 

<?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();
$c->test();   //fails
?>

خروجی رو به هم به این صورت قرار داده :

 

success!
success!
success!


Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9


اگر ممکن هست علت چاپ سه بار عبارت success! رو توضیح بدید ممنون میشم.

همینطور  هم در مورد اروری که بر خورده.

فایل پیوست

محمدرضا حسینی
محمدرضا حسینی

25 شهریور 00

0
حذف شده

درود

$b = new B();
$b->test();

این خط از کد همونطور که میدونید داره تابه test رو صدا میزنه و داخل تابع  test هم دوباره foo صدا زده شده و محتوای داخل تابع test در کلاس A به شکل زیره

    public function test() {
        $this->foo();
        static::foo();
    }

حالا وقتی به این خط میرسه

$c = new C();
$c->test();  

دوباره تابع test صدا زده میشه و این خط از کد $this->foo(); زده میشه و  مشکلی با صدا زدنش وجود نداره (چون به شکل static اینجا صدا زده نمیشه) و تا اینجا سه تا success چاپ میشه اما به محض اینکه میرسه به static::foo(); به خطا میخوره

خطا هم به خاطر اینکه  متد foo دوباره داخل کلاس C تعریف شده و باعث شده که scopeش تغیر کنه و نمیتوته تابع foo  (که private هم هست)رو به شکل static صدا بزنه (اگه تابع دوباره داخل کلاس B تعریف نشه scope تغییری نمیکنه و خطایی پیش نمیاد)

 

 

 

 

فایل پیوست

امیر صالحی

توسط

امیر صالحی

25 شهریور 00

0
حذف شده

ممنون از توضیحات.

static مگه از خود همون کلاسی که ازش نمونه ساخته شده تابع رو صدا نمیزنه؟یعنی در این مثال از خود کلاس C متود درون کلاس C رو صدا نمیزنه؟

فایل پیوست

محمدرضا حسینی

توسط

محمدرضا حسینی

25 شهریور 00