Подтвердить что ты не робот

Переменные статической функции и конкатенация в PHP

Рассмотрим следующее:

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

Как только я отмечаю $var как static, однако:

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

PHP (5.3.1 в настройке WAMP) жалуется на следующую ошибку:

Ошибка анализа: синтаксическая ошибка, неожиданные '.', ожидающие ',' или ';'

Кажется, что конкатенация строк является виновником здесь.


Что здесь происходит? Может кто-нибудь объяснить правила для статических переменных для меня?

4b9b3361

Ответ 1

В руководстве указано Область переменных:

Попытка присвоить значения этим [статическим] переменным, являющимся результатом выражений, вызовет ошибку синтаксического анализа.

Здесь также упоминается статическое ключевое слово:

Как и любая другая статическая переменная PHP, статические свойства могут быть инициализированы только с помощью литерала или константы; выражения не допускаются.

Хотя следует отметить, что свойство, статическое или нет, не может быть инициализировано с помощью выражения.

Ответ 2

Вы не можете выполнять выражения в инициализаторах. Вы можете, однако, сделать это:

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

Малоизвестный факт состоит в том, что хотя инициализаторы не могут содержать выражения времени выполнения, они могут содержать константы, которые могут быть определены и разрешены во время выполнения. Константа должна определяться временем $var, хотя в противном случае вы получите строку, идентичную константе (например, "FOOBAR").

Ответ 3

Я делаю это:

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();