Доступ к статическому методу в определении статической переменной

Я пытаюсь получить доступ к методу статического класса в определении переменной статического класса. Я попытался несколько попыток, но не могу получить код для компиляции.

Наивная попытка:

<?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

Другие вопросы по тегам