Переменные статической функции и конкатенация в 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) жалуется на следующую ошибку:
Ошибка анализа: синтаксическая ошибка, неожиданные '.', ожидающие ',' или ';'
Кажется, что конкатенация строк является виновником здесь.
Что здесь происходит? Может кто-нибудь объяснить правила для статических переменных для меня?
Ответы
Ответ 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();