use*_*437 6 php methods class self non-static
为什么在这个例子中对非satic方法的"自我"调用有效?
class A{
    protected function aNonStaticMethod(){
        return __class__;
    }
    public function aEcho(){
        echo self::aNonStaticMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的解释.
在你的简单例子中,$ this和self是可互换的.但是请注意在处理继承时解决的不同方法(我为完整性添加了静态):
class A {
    protected function aNonStaticMethod(){
        return __class__;
    }
    public function selfEcho(){
        echo self::aNonStaticMethod();
    }
    public function staticEcho(){
        echo static::aNonStaticMethod();
    }
    public function thisEcho(){
        echo $this->aNonStaticMethod();
    }
}
class B extends A {
    protected function aNonStaticMethod(){
        return __class__;
    }
}
$b = new B();
$b->selfEcho(); // A
$b->staticEcho(); // B
$b->thisEcho(); // B
Run Code Online (Sandbox Code Playgroud)
        理论上它应该不是工作,而是因为这个评论说:
php4中没有static关键字,但是php4确实允许进行静态调用。为了保持向后兼容性,在php5中添加static关键字时保留了该功能。
此注释由以下官方php.net Wiki 支持:
如果调用是通过实例方法进行的,则此方法已被弃用。不将方法注释为静态是过时的PHP4-ism。
您真的不应该静态地调用非静态方法-这没有任何意义(如果有static关键字)。
...因为a)这是一种不好的方法,并且b)PHP文档说:
注意
在PHP 5中,静态调用非静态方法会生成E_STRICT级警告。
和
警告
在PHP 7中,不建议静态调用非静态方法,它将生成E_DEPRECATED警告。将来可能会删除对静态调用非静态方法的支持。
::运算符进行非静态呼叫-可能是一个好方法!正如@Kontrollfreak指出的那样,正如本文档所说,该::运算符不限于静态调用:
的双冒号,是令牌允许访问静态的,恒定的, 以及重写特性或一类的方法
因此,如果您以这种方式引用父类的方法或属性,则可以- 不仅限于直接父类。
在编写此答案的过程中,我忘了提到某些情况,即调用是静态的,但在内部调用动态方法-有关更多信息,请参见Facade或Singleton之类的模式。
但是,请勿将它们与上述问题相混淆!(上面的问题是关于对应该动态调用的动态事物使用直接静态调用,这些模式是关于静态调用静态方法,然后可以动态(内部)调用静态方法)。