鍍金池/ 問(wèn)答/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,該怎么理解這個(gè)呢?

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

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

這兩種到底哪種對(duì)呢?

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

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

你的猜想二是對(duì)的.

PHP 靜態(tài)綁定

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

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

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

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

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

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

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

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

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ù)寫(xiě)一下就好理解

2018年8月13日 02:30