PHP在非静态方法上调用self

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)

谢谢你的解释.

war*_*rly 7

在你的简单例子中,$ 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)


jav*_*web 5

静态调用非静态方法

理论上它应该不是工作,而是因为这个评论说:

php4中没有static关键字,但是php4确实允许进行静态调用。为了保持向后兼容性,在php5中添加static关键字时保留了该功能。

此注释由以下官方php.net Wiki 支持:

如果调用是通过实例方法进行的,则此方法已被弃用。不将方法注释为静态是过时的PHP4-ism。

您真的不应该静态地调用非静态方法-这没有任何意义(如果有static关键字)。

避免完全静态地调用非静态方法!

...因为a)这是一种不好的方法,并且b)PHP文档说:

注意
在PHP 5中,静态调用非静态方法会生成E_STRICT级警告。

警告
在PHP 7中,不建议静态调用非静态方法,它将生成E_DEPRECATED警告。将来可能会删除对静态调用非静态方法的支持。

使用::运算符进行非静态呼叫-可能是一个好方法!

正如@Kontrollfreak指出的那样,正如本文档所说,该::运算符不限于静态调用:

双冒号,是令牌允许访问静态的,恒定的, 以及重写特性或一类的方法

因此,如果您以这种方式引用父类的方法或属性,则可以- 不仅限于直接父类。

编辑:不要误认为这是Fascade等软件模式!

在编写此答案的过程中,我忘了提到某些情况,即调用是静态的,但在内部调用动态方法-有关更多信息,请参见FacadeSingleton之类的模式。
但是,请勿将它们与上述问题相混淆!(上面的问题是关于对应该动态调用的动态事物使用直接静态调用,这些模式是关于静态调用静态方法,然后可以动态(内部)调用静态方法)。

  • 即使您未使用“ self”或“ parent”,双冒号“ ::”也不一定意味着调用是(或应该是)静态的。您还如何引用不是* direct *父级的父类的方法?明白我的意思:[沙箱示例](http://sandbox.onlinephpfunctions.com/code/e4029741e62fc9761acd9bcf6bce791192baf653) (3认同)
  • 我认为您在这里混在一起。是的,[文档](http://php.net/manual/zh/language.oop5.static.php)说,不建议静态调用非静态方法。但是使用`self :: someNonStaticMethod()`不是静态调用。使用`self ::`比使用$ this->更具体*,因为前者总是引用其起源类。我用[`self ::`](http://sandbox.onlinephpfunctions.com/code/de2edb50a2b409b92d7714ea10b6014673176103)和[`$ this->`](http://sandbox.onlinephpfunctions.com/code/4757589885dcbd796e9bd41ed23a25f33ada )以显示差异。 (2认同)