为什么不
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;
}
}
确实有效。
我是OOP的新手,我很困惑。
答案 0 :(得分:7)
您无法使用非常量表达式初始化任何成员变量(属性)。换句话说,在你声明它的地方没有调用函数。
来自PHP manual:
此声明可能包括初始化,但此初始化必须是常量值 - 也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估。
我可以给出为什么的最佳答案?因为静态字段初始值设定项实际上并不是在任何类型的上下文中运行。调用静态方法时,您处于该函数调用的上下文中。设置非静态属性时,您位于构造函数的上下文中。设置静态字段时,您的上下文是什么?
答案 1 :(得分:3)
类成员只能包含常量和文字,而不是函数调用的结果,因为它不是常量值。
来自PHP Manual:
与任何其他PHP静态变量一样,静态属性只能使用文字或常量初始化;表达式是不允许的。因此,虽然您可以将静态属性初始化为整数或数组(例如),但您可能不会将其初始化为另一个变量,函数返回值或对象。
答案 2 :(得分:1)
他们已经解释了为什么它不起作用。这将是解决方法。
class SomeClass {
public static $currentTime = null;
__construct() {
if (self::$currentTime === null) self::$currentTime = time() + 7200;
}
}
答案 3 :(得分:0)
其他人已经解释了为什么你不能。但也许你正在寻找一种解决方法(Demo):
My_Class::$currentTime = time() + 7200;
class My_Class
{
public static $currentTime;
...
}
你不正在寻找构造函数,你正在寻找静态初始化。