Доступ к статическому методу в определении статической переменной
Я пытаюсь получить доступ к методу статического класса в определении переменной статического класса. Я попытался несколько попыток, но не могу получить код для компиляции.
Наивная попытка:
<?php
class TestClass {
private static $VAR = doSomething(array());
private static function doSomething($input) {
return null;
}
}
?>
Ошибка:
dev@box:~/php$ php -l TestClass.php
PHP Parse error: syntax error, unexpected '(', expecting ',' or ';' in TestClass.php on line 3
Errors parsing TestClass.php
Интуитивная попытка:
<?php
class TestClass {
private static $VAR = self::doSomething(array());
private static function doSomething($input) {
return null;
}
}
?>
Ошибка:
dev@box:~/php$ php -l TestClass.php
PHP Parse error: syntax error, unexpected '(', expecting ',' or ';' in TestClass.php on line 3
Errors parsing TestClass.php
Логическая попытка:
<?php
class TestClass {
private static $VAR = static::doSomething(array());
private static function doSomething($input) {
return null;
}
}
?>
Ошибка:
dev@box:~/php$ php -l TestClass.php
PHP Fatal error: "static::" is not allowed in compile-time constants in TestClass.php on line 3
Errors parsing TestClass.php
Отчаянная попытка:
<?php
class TestClass {
private static $VAR = $this->doSomething(array());
private static function doSomething($input) {
return null;
}
}
?>
Ошибка:
dev@Dev08:~/php$ php -l TestClass.php
PHP Parse error: syntax error, unexpected '$this' (T_VARIABLE) in TestClass.php on line 3
Errors parsing TestClass.php
Задача кажется такой простой, используйте статический метод для определения статической переменной, но я не могу понять, как правильно получить доступ к статическому методу в контексте объявления статической переменной.
Как вы вызываете статический метод в определении статической переменной в PHP v5.5.3
?
1 ответ
Правильная попытка:
<?php
class TestClass {
private static $VAR = null;
private static function doSomething($input) {
return null;
}
public static function Construct(){
self::$VAR = self::doSomething(array());
}
}
TestClass::Construct();
?>
Вы МОЖЕТЕ инициализировать статическое в скаляр и массив. Вы НЕ МОЖЕТЕ инициализировать его с помощью вызова функции. Поэтому вам нужен публичный метод, который можно вызвать для инициализации статики, если вам нужно, чтобы вещи были приватными.
Если бы они были публичными, вы могли бы сделать:
TestClass::$VAR = TestClass::doSomething(array());
сразу после объявления класса или когда вы хотите создать его экземпляр.
Доказательство
Как и любая другая статическая переменная PHP, статические свойства могут быть инициализированы только с использованием литерала или константы; выражения не допускаются. Поэтому, хотя вы можете инициализировать статическое свойство целым числом или массивом (например), вы не можете инициализировать его другой переменной, возвращаемым значением функции или объектом. с PHP.net/Static