Почему
public static $CURRENT_TIME = time() + 7200;
работа (ошибка):
Ошибка анализа: синтаксическая ошибка, неожиданная '('
но
class Database { public static $database_connection; private static $host = "xxx"; private static $user = "xxx"; private static $pass = "xxx"; private static $db = "xxx"; public static function DatabaseConnect(){ self::$database_connection = new mysqli(self::$host,self::$user,self::$pass,self::$db); self::$database_connection->query("SET NAMES 'utf8'"); return self::$database_connection; } }
работает.
Я новичок в ООП, я так смущен.
Вы не можете инициализировать любую переменную-член (свойство) с не константным выражением. Другими словами, нет вызывающих функций там, где вы его объявляете.
Из руководства по PHP :
Это объявление может включать инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть способна быть оценена во время компиляции и не должна зависеть от информации о времени выполнения для оценки.
Лучший ответ, который я могу дать, почему ? Поскольку инициализаторы статического поля не работают с каким-либо контекстом. Когда вызывается статический метод, вы находитесь в контексте этого вызова функции. Когда задано нестатическое свойство, вы находитесь в контексте конструктора. В каком контексте вы устанавливаете статическое поле?
Члены класса могут содержать только константы и литералы, а не результат вызовов функций, поскольку это не постоянное значение.
Из руководства PHP :
Как и любая другая статическая переменная PHP, статические свойства могут быть инициализированы только с использованием литерала или константы; выражения не допускаются. Поэтому, хотя вы можете инициализировать статическое свойство для целого или массива (например), вы не можете инициализировать его другой переменной, возвращаемым значением функции или объектом.
Они объясняют, почему это не работает. Это будет работать.
class SomeClass { public static $currentTime = null; __construct() { if (self::$currentTime === null) self::$currentTime = time() + 7200; } }
Другие уже объяснили, почему вы не можете. Но, возможно, вы ищете работу ( Demo ):
My_Class::$currentTime = time() + 7200; class My_Class { public static $currentTime; ... }
Вы не ищете конструктора, вы ищете статическую инициализацию.