如何在PHP中从公共静态方法访问私有类属性

4

我有一个类(yii2小部件),其中包含私有属性和公共静态函数。当我尝试从静态方法访问私有属性,如$this->MyPrivateVar会生成一个错误,提示我在非对象上下文中不必使用$this!以下是我的代码片段:

class JuiThemeSelectWidget extends Widget
{
  private $list;
  private $script;
  private $juiThemeSelectId = 'AASDD5';
  public $label;
  ....
 public static function createSelectList($items)
  {
    $t = $this->juiThemeSelectId;
    ...
  }

我尝试了下面的方法,但似乎陷入了无限循环,导致出现了“执行时间超过50秒”的错误提示!
public static function createSelectList($items)
  {
    $t = new JuiThemeSelectWidget;
    $juiThemeSelectId = $t->juiThemeSelectId;
    ...
  }

那么我如何从静态方法访问私有的juiThemeSelectId


$itemsWidget 类吗? - Willem Van Onsem
不,它只是从另一个方法传递给该方法的参数。@CommuSoft - SaidbakR
2个回答

5
简短的答案是:您无法在静态方法中访问非静态属性。您无法在静态方法中访问$this
您可以将该属性更改为静态,例如:
private static $juiThemeSelectId = 'AASDD5';

然后这样访问它:

echo self::$juiThemeSelectId;

更多关于关键字 static 的信息,请查看手册:http://php.net/manual/en/language.oop5.static.php 以下是摘自该手册的一段引用:
由于静态方法可以在创建对象实例的情况下调用,因此在声明为静态的方法内部不可使用伪变量 $this。

正如你所说,我将属性设置为private static,然后尝试从公共静态方法中访问它,如$t = self::$juiThemeSelectId;,但是它会报错:Getting unknown property: common\libs\JuiThemeSelectWidget::juiThemeSelectId - SaidbakR
1
@sємsєм,您能否告诉我您现在使用的代码是如何导致出现这个错误的? - Rizier123
抱歉,你的解决方案很好,我只是忘记在另一行中将其称为“$this”。 - SaidbakR
1
@sємsєм 没问题,很高兴能帮助你! - Rizier123

0

你可以使用self来访问它:

public static function createSelectList($items)
{
  $t = self::juiThemeSelectId;
  ...
}

当使用self时,会引发以下错误:Undefined class constant 'juiThemeSelectId' - SaidbakR
抱歉,我没有意识到在你的示例中juiThemeSelectId不是静态的...请参考@Rizier123的回答。 - bohrsty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接