Переменные статических функций и конкатенация в PHP - PullRequest
17 голосов
/ 12 февраля 2011

Обратите внимание на следующее:

$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)жалуется со следующей ошибкой:

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

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


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

Ответы [ 3 ]

12 голосов
/ 12 февраля 2011

В ручном режиме в Область действия переменных :

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

Об этом также упоминается в Статическое ключевое слово :

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

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

4 голосов
/ 12 февраля 2011

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

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

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

1 голос
/ 13 мая 2012

Я делаю это:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...