18

Consider the following:

$var = 'foo' . 'bar'; # Not a member of a class, free-standing or in a function.

As soon as I mark $var as static, however:

static $var = 'foo' . 'bar';

PHP (5.3.1 on a WAMP setup) complains with the following error:

Parse error: syntax error, unexpected '.', expecting ',' or ';'

It seems that the string concatenation is the culprit here.


What's going on here? Can someone explain the rules for static variables to me?

jklanders
  • 183
  • 1
  • 4

3 Answers3

12

The manual states, in Variables scope:

Trying to assign values to these [static] variables which are the result of expressions will cause a parse error.

There is also mention of it in Static keyword:

Like any other PHP static variable, static properties may only be initialized using a literal or constant; expressions are not allowed.

Although it should be noted that a property, static or not, cannot be initialized using an expression neither.

netcoder
  • 66,435
  • 19
  • 125
  • 142
  • why is this? How can I do some thing like : `public static $model_path=APP_PATH."/models/";` – Hafiz May 02 '12 at 20:09
  • 1
    @Hafiz: You can't, because these are evaluated at compile-time. Constants and string literals are evaluated at compile-time so `static $foo = "a";` or `public $foo = CONSTANT;` works. Expressions, like `public $foo = 1 + 2;` or `static $foo = 'a' . 'b';` are evaluated at runtime. – netcoder May 02 '12 at 20:24
  • 1
    In your case, you could simply define a `MODEL_PATH` constant. Do something like: `define('MODEL_PATH', APP_PATH."models/");` then use this constant instead in your class: `class Foo { public static $model_path = MODEL_PATH; }`. Either that, or initialize them in the constructor or initialization method. – netcoder May 02 '12 at 20:25
  • I appreciate your reply but this way I will be such paths one thing at 2 places every time :| . May be I should use constant at all those places where I am using static variables with expressions. – Hafiz May 02 '12 at 20:47
  • Note that "From PHP 5.6 you can assign values to these variables which are the result of expressions ... some limited expressions are possible, provided they can be evaluated at compile time." Expressions like `1 + 2` and `'a' . 'b'` can be used from PHP 5.6 onwards for compile-time evaluation. – Jake Oct 30 '19 at 22:48
5

You can not do expressions in initializers. You can, however, do this:

define('FOOBAR', 'foo'.'bar');
static $var = FOOBAR;
echo $var;

Little known fact is that even though initializers can not contain runtime expressions, it can contain constants which can be defined and resolved at runtime. The constant has to be defined by the time $var is first used though, otherwise you'll get string identical to the constant (e.g. "FOOBAR").

StasM
  • 10,593
  • 6
  • 56
  • 103
  • mean I must need to define every thing as constant if I need to concatenate any thing? Mean every single initialization will take 2 steps? – Hafiz May 02 '12 at 20:10
  • Not every single one, just ones where you need to use expressions. – StasM May 03 '12 at 06:56
1

I do this:

class MyClass {

  static $var1;
  static $var2;
  public static function _init() {
      self::$var1 = 'slkslk' . 'sksks' . 'arbitrary' ; 
      self::var2 = <<<EOT
          <root>
            <elem1>skjsksj</elem1>
          </root>
EOT;
  }
}
MyClass::_init();
Cheeso
  • 189,189
  • 101
  • 473
  • 713