【问题标题】:PHP: calling on an instance's private method inside an instance's static classPHP:在实例的静态类中调用实例的私有方法
【发布时间】:2017-06-11 00:54:07
【问题描述】:

我想要做的是:

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

任何帮助表示赞赏!

【问题讨论】:

  • 我无法重现该错误。你用的是什么版本的PHP?
  • @wogsland 发表了评论 - 显然是由于 PHPStorm 调试

标签: php private


【解决方案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

【讨论】:

  • 我不认为这是一般规则(您的示例)。这些类应该是相同的类型。
  • 你是对的,在答案中添加了这个澄清
【解决方案2】:

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

【讨论】:

  • 啊,有道理。
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 2012-12-03
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
相关资源
最近更新 更多