繁体   English   中英

PHP在非静态方法上调用self

[英]PHP Calling self on a non-static method

为什么在这个例子中对非satic方法的“自我”调用有效?

class A{

    protected function aNonStaticMethod(){
        return __class__;
    }

    public function aEcho(){
        echo self::aNonStaticMethod();
    }
}

谢谢你的解释。

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

静态调用非静态方法

理论上它应该工作,但这个评论说:

php4中没有静态关键字,但php4允许静态调用。 为了保持向后兼容性,这是在php5中添加static关键字时留下的。

此注释是支持这个官方php.net维基:

如果从实例方法进行调用,则已弃用此选项。 没有将方法注释为静态是一种过时的PHP4主义。

你真的不应该静态地调用非静态方法 - 它没有意义(如果有一个static关键字)。

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

...因为a)这是一种糟糕的方法,而且b) PHP文档说:

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

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

使用:: operator进行非静态调用 - 可能是一个很好的方法!

正如@Kontrollfreak所指出的那样,并且正如本文所述, ::运算符不仅限于静态调用:

双冒号 ,是一个允许访问类的静态,常量和重写属性或方法的标记

因此,如果您以这种方式引用父类中的一个或多个方法( 也不限于直接父 ),则可以。

编辑:不要误以为Fascade等软件模式!

在写这个答案的过程中,我忘了提到可能存在这样的情况,当调用是静态的,但在内部调用动态方法 - 有关更多信息,请参阅FacadeSingleton等模式。
但是请不要将这些问题与上述问题混在一起! (上面的问题是关于对应该动态调用的动态事物使用直接静态调用,这些模式是关于静态调用静态方法,然后可以动态地调用动态(内部))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM