PHP类$_SERVER变量作为属性

4

我正在开发一个类,它有以下结构:

class userInfo {
    public $interval        = 60;
    public $av_langs        = null;

    public $ui_ip           = $_SERVER['REMOTE_ADDR'];
    public $ui_user_agent   = $_SERVER['HTTP_USER_AGENT'];

    public $ui_lang         = null;
    public $ui_country      = null;

    // non-relevant code removed
}

但是当我执行脚本时,我遇到了这个错误:

解析错误:语法错误,在 D:\ web \ www \ poll \ get_user_info \ get_user_info.php的第12行处出现意外的T_VARIABLE

当我将2个$_SERVER变量更改为简单字符串时,错误消失了。

那么在声明类属性时,$_SERVER有什么问题呢?

谢谢


4
以上不是变量赋值,而是类属性的声明。因此它们不能保存表达式。在那里不允许。你必须使用常量或在构造函数中完成。http://www.php.net/manual/en/language.oop5.properties.php - mario
3个回答

13

使用此代码作为指南:

public function __construct() {
    $this->ui_ip = $_SERVER['REMOTE_ADDR'];
    $this->ui_user_agent = $_SERVER['HTTP_USER_AGENT'];
}

5

属性只能通过值进行声明,而不是表达式。
您可以创建__construct()方法,在其中以任何方式初始化属性。


好的,你能给我一个简单的例子吗?我不太熟悉类。 - medk
我编写了简单的set_ip()和get_ip()函数,并使用以下代码:$ui->set_ip($_SERVER['REMOTE_ADDR']);$ui->get_ip();它可以正常工作,但为什么不直接声明呢? - medk
1
@medk 因为 $_SERVER['REMOTE_ADDR'] 是表达式,而表达式在该范围内不被允许(因为任何表达式只能在运行时获取)。__construct()是一个"魔法"方法,在其中您可以以任何方式初始化所有属性。请在手册中阅读更多信息 - OZ_

3

那么在声明类属性时,$_SERVER有什么问题呢?

你无法使用变量或函数调用来预设类属性。

这里有一些关于为什么不能在PHP属性中使用函数的深入讨论:Why don't PHP attributes allow functions?

然而,最终结论是,这是不可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接