鍍金池/ 問答/PHP/ 怎么理解PHP里的self呢?

怎么理解PHP里的self呢?

    class A {
        const STR = "A";

        public function x() {
            echo self::STR;
        }
    }

    class B extends A{
        const STR = "B";
    }

    (new B)->x();

最后輸出結(jié)果是A,該怎么理解這個呢?

猜想一:
self在編譯時會綁定為當(dāng)前類,可理解成編譯時所有的self替換為所處類名,
這樣別的類繼承父類方法后,方法代碼里并不是self::xxx,而是父類名::xxx
所以例子里的str就是父類里的str

猜想二:
子類繼承父類方法,其實(shí)并不是把父類方法拿過來,而是有了父類方法的訪問權(quán)限,
當(dāng)調(diào)用子類里沒有的方法時,會去父類里找,找到后在父類里執(zhí)行,自然就self指向父類

這兩種到底哪種對呢?

如果都不對的話應(yīng)該怎么理解self呢?先謝謝大家指點(diǎn)了

回答
編輯回答
涼汐
使用 self:: 或者 CLASS 對當(dāng)前類的靜態(tài)引用,取決于定義當(dāng)前方法所在的類

你的猜想二是對的.

PHP 靜態(tài)綁定

2017年10月11日 20:04
編輯回答
咕嚕嚕

self是指首先使用父類屬性
static是指首先使用當(dāng)前類屬性

2018年3月29日 07:47
編輯回答
夏夕

self:定義當(dāng)前方法所在的類
static:運(yùn)行時所在的類

2018年5月13日 16:51
編輯回答
淚染裳

實(shí)際上他們的原理是:
self 是針對當(dāng)前本類的使用
this 是對當(dāng)前類的調(diào)用,如果當(dāng)前類沒有,則找尋到父類去

2017年4月27日 12:27
編輯回答
旖襯

簡而言之 self指向的是當(dāng)前類 this指向的是當(dāng)前對象

2017年6月23日 05:02
編輯回答
別傷我
<?php
class A {
    const STR = "A";

    public function x() {
        echo self::STR;
    }
}

class B extends A{
    const STR = "B";  
    public function x() {
        echo self::STR;
    }  
}

(new B)->x();

復(fù)寫一下就好理解

2018年8月13日 02:30