php静态变量初始化使用$ this关键字

问题描述 投票:2回答:3

我在类中有一个方法,我想在其中初始化一个静态变量。

1 /当我初始化变量,然后使用$this关键字将其影响到其他值时,它可以工作。例如。:

class Test {
   // ...
   function test($input_variable)
   {
      static $my_static_variable = null;
      if (!isset($my_static_variable))
        $my_static_variable = $this->someFunction($input_variable);
      // ... some further processing 
   }
}

2 /但是,当我尝试使用$this关键字直接初始化/构造变量时,会出现语法错误:unexpected '$this' (T_VARIABLE)

class Test {
       // ...
       function test($input_variable)
       {
          static $my_static_variable = $this->someFunction($input_variable); // *** syntax error, unexpected '$this' (T_VARIABLE)
          // ... some further processing 
       }
}

是1 /初始化静态变量的好方法吗?为什么2 /不允许,因为它应该做的完全相同的事情比1 /?

我正在使用PHP 5.5.21(cli)(内置:2016年7月22日08:31:09)。

谢谢

php variables static initialization
3个回答
0
投票

你不能在静态变量上使用$this。您可以使用self和范围分辨率运算符(::)代替。

这是一个例子:

class Foo {
  public static $my_stat;

  static function init() {
    self::$my_stat= 'My val';
  }
}

0
投票

无需实例化类即可访问静态变量和函数。您不能使用$ this来访问声明为static的变量或函数。您必须使用范围解析operator ::来访问声明为static的变量和函数。

对于变量: -

class A
{
    static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;// Try to use $this here insted of self:: you will get error
    }
}

class B extends A
{
    public function fooStatic() {
        return parent::$my_static;
    }
}

使用以下内容访问变量: -

print A::$my_static

功能: -

class A {
    public static function aStaticMethod() {
        // ...
    }
}

您可以按如下方式调用该函数: -

A::aStaticMethod();

0
投票

我想我有答案。在php documentation中,陈述如下:

可以声明静态变量,如上面的示例所示。从PHP 5.6开始,您可以为这些变量赋值,这些变量是表达式的结果,但是您不能在此处使用任何函数,这将导致解析错误。

所以我想这也适用于PHP 5.5。

正如@MagnusEriksson指出的那样,我也可以使用类属性。但是,除了test()方法之外,我不希望在其他地方访问我的变量。

顺便说一句,在某种程度上,doc中的静态属性也是如此:

使用箭头运算符 - >无法通过对象访问静态属性。

与任何其他PHP静态变量一样,静态属性只能在PHP 5.6之前使用文字或常量进行初始化;表达式是不允许的。在PHP 5.6及更高版本中,相同的规则适用于const表达式:一些有限的表达式是可能的,只要它们可以在编译时进行评估。

© www.soinside.com 2019 - 2024. All rights reserved.