为什么PHP支持将静态函数作为非静态成员方法调用?

时间:2018-10-23 11:40:57

标签: php oop static

预先从5.0.0版开始编码的完全有效代码(无E_STRICT或E_DEPRECATED)

class A{
    static public function b() {
    }

    public function c(){
        $this->b();
    }
}

$d = new A();
$d->c();
$d->b();

这看起来像是不一致的行为,因为您不能使用实例中的静态属性。

  

PHP的方法是随时窃取和借鉴其他语言   可能...

但是我找不到任何支持类似行为的编程语言。

PHP为什么支持它?将静态方法称为非静态方法有什么意义?

一些支持的解释:Expected behavior

2 个答案:

答案 0 :(得分:2)

实际上,C ++和Java支持此功能。经过讨论,PHP开发人员似乎决定实现与他们匹配的方法。

经过一番挖掘,我发现2004年2月的this thread实质上是他们对实现选择的讨论。讨论中的重要花絮:

From Cristiano Duarte

  
    当bar()是静态方法时,

C ++允许$ a-> bar()(是的,它被称为     在静态环境中也是如此)。

         

IMO,此处不应有错误,警告或通知。

  
     

我同意。 PHP很好。

From Art

  

无论最终实现如何,我认为都可以使用静态方法和   静态类变量应保持一致。目前,您无法访问   通过对象实例的类变量。

     

对于它的价值,我看不出为什么不能调用静态方法的原因   从物体。在这种情况下,请遵循Java / C ++。

最终,一个最终决定From Wez

  

请删除该线程;我们没有改变静态的行为。

答案 1 :(得分:1)

在我看来,这只是语法方面的考虑。这里没有什么与静态方法的逻辑矛盾,在静态函数中仍然无法使用$this,因此该函数将无法访问实例属性或方法。对我来说,这更像是捷径,而不是前后矛盾。

我没有用例,但是我想有人可能会发现它对于使用动态类名创建的对象很有用:即使您不知道它的类名,您仍然可以使用该函数。