怎么理解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呢?先谢谢大家指点了

阅读 5.2k
6 个回答
使用 self:: 或者 CLASS 对当前类的静态引用,取决于定义当前方法所在的类

你的猜想二是对的.

PHP 静态绑定

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

<?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();

复写一下就好理解

self:定义当前方法所在的类
static:运行时所在的类

简而言之 self指向的是当前类 this指向的是当前对象

self是指首先使用父类属性
static是指首先使用当前类属性

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题