怎么理解PHP里的self呢?

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

    (new B)->x();

最后输出结果是A,该怎么理解这个呢?

猜想一:
self在编译时会绑定为当前类,可理解成编译时所有的self替换为所处类名,
这样别的类继承父类方法后,方法代码里并不是self::xxx,而是父类名::xxx
所以例子里的str就是父类里的str

猜想二:
子类继承父类方法,其实并不是把父类方法拿过来,而是有了父类方法的访问权限,
当调用子类里没有的方法时,会去父类里找,找到后在父类里执行,自然就self指向父类

这两种到底哪种对呢?

如果都不对的话应该怎么理解self呢?先谢谢大家指点了


呼如林
浏览 1280回答 3
3回答

小怪兽爱吃肉

使用 self:: 或者 CLASS 对当前类的静态引用,取决于定义当前方法所在的类你的猜想二是对的.

慕少森

实际上他们的原理是:self 是针对当前本类的使用this 是对当前类的调用,如果当前类没有,则找寻到父类去

动漫人物

<?phpclass&nbsp;A&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;STR&nbsp;=&nbsp;"A";&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;x()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;self::STR; &nbsp;&nbsp;&nbsp;&nbsp;} }class&nbsp;B&nbsp;extends&nbsp;A{&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;STR&nbsp;=&nbsp;"B";&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;x()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;self::STR; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; } (new&nbsp;B)->x();复写一下就好理解
打开App,查看更多内容
随时随地看视频慕课网APP