PHP: 在实例的静态 class 中调用实例的私有方法

PHP: calling on an instance's private method inside an instance's static class

我想做的是:

class A {

  public function __construct($a) {
    // stuff here
  }

  public static function request() {
    $instance = new self("hi");
    $instance->bye(); // this weirdly only sometimes throws errors
  }

  private function bye() {
    // stuff here
  }

}

A::request();

感兴趣的是 $instance->bye() - 这在某种程度上允许在静态上下文中使用,但是当在实例上调用时并且在与构造函数相同的 class 中调用时?或者这不是一般的好做法?奇怪的是,这有时只会抛出调用没有上下文的私有方法的错误。

感谢任何帮助!

永远不要从静态方法调用常规方法。

因为可能根本就没有实例(例如:直接调用A::request()),会报错。
静态方法对于 class 的所有实例都是相同的,因此它将无法访问 non-static 属性。

可以但不应该做的是从静态方法调用相同类型对象的私有方法:

<?php
class A {
    private function foo()
    {
        print("bar");
    }

    static public function bar($a)
    {
        $a->foo();
    }
}

$a = new A();

A::bar($a);
?>

来自http://php.net/manual/en/language.oop5.visibility.php

事实证明这很好,PHPStorm 调试器制造了问题并搞砸了上下文,因此为什么错误只是有时发生,而这显然发生在我们的系统上¯_(ツ)_/¯