为什么PHP分配上下文静态方法调用,并没有给出一个E_STRICT通知?(Why does PHP

2019-10-30 06:03发布

我跑进在PHP5.4一些很奇怪的行为(也存在于5.5)。 我基本上是静态调用非静态方法,我没有得到,我绝对应该得到的一个E_STRICT错误。

<?php
error_reporting(E_ALL);
class A
{
    public function iAmNotStatic() {}
}

现在,如果我这样做:

A::iAmNotStatic();

然后,我得到的错误预期Strict standards: Non-static method A::iAmNotStatic() should not be called statically

而且,如果我做从对象上下文的号召,我也得到了同样的错误(如预期)

class B 
{
    public function __construct() {
        A::iAmNotStatic();
    }
}

$b = new B(); // error here, as expected

但是,如果我这样做(指定为B的母公司):

class B extends A
{
    public function __construct() {
        A::iAmNotStatic();
    }
}

$b = new B(); // no error 

那么PHP决定,“没问题,我有一个对象($ b)用相同的父类(A),我们只是让它为上下文iAmNotStatic ”。

所以,这是一个功能或一个错误,可能是什么的这种混乱的(无证?)行为的目的是什么? 谢谢 :)

Answer 1:

在第一种情况下,你有没有对象上下文因为你打电话给你来自外太空的非静态方法。 但是在第二种情况下,你因为对象上下文$this将参考实例B - ,因此,PHP会发现,对象上下文存在,因此,它是非静态方法的非静态调用(一切好)。 如果你正在犹豫通过电话:: -那么,我想,你应该提醒的是,例如, parent::method()是一个有效的呼叫。 即指方法是不是这里的问题。

更加具体:

class A
{
   public function foo()
   {
      echo('foo called, class: '. get_class($this).PHP_EOL);
   }
}

class B extends A
{
   public function __construct()
   {
      A::foo();
   }
}

$b=new B(); //foo called, class: B 

所以你会看到类B ,因为预期foo()被继承。



文章来源: Why does PHP assigns context to a static method call and does not give an E_STRICT notice?