PHP:在实例的静态类

时间:2017-01-25 17:58:49

标签: php private

我要做的是以下内容:

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() - 这在静态上下文中是否允许某种方式但是在实例上调用并且在与构造函数相同的类内?或者这不是一般的好习惯吗?奇怪的是,这有时只会在没有上下文的情况下调用私有方法时抛出错误。

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

事实证明这很好,PHPStorm调试器正在创建问题并搞砸了上下文,因此错误只发生在我们的系统上有时会发生的事情¯_(ツ)_ /¯

答案 1 :(得分:-1)

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

由于可能根本没有实例(例如:直接调用A::request()),因此会抛出错误。
静态方法对于类的所有实例都是相同的,因此它无法访问非静态属性。

从静态方法调用相同类型私有方法的对象

可以做但不应该做什么?
<?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