如何使用$ _SERVER superglobals定义类的常量成员?

时间:2016-12-31 18:58:16

标签: php

我有这段代码

class View
{
   const DEFAULT_VIEWS_DIRECTORY =  $_SERVER["DOCUMENT_ROOT"] . "views/";
}

但是,它给了我语法错误

  

解析错误:解析错误:语法错误,意外' $ _ SERVER'第17行的C:\ xampp \ htdocs \ classes \ View.class.php中的(T_VARIABLE)

我检查了manual,然后说

  

值必须是常量表达式,而不是(例如)变量,属性或函数调用。

有什么工作可以做我想要的吗?,因为我在课堂上大量消耗这个值,并且将此作为常量将使课程更漂亮

1 个答案:

答案 0 :(得分:1)

正如您所注意到的,Expression不允许作为类常量值,但它不会阻止您启动默认视图目录一次并在不同场合使用它:

class View
{
    private $defaultViewDirectory;

    public function __construct()
    {
        $this->defaultViewDirectory = $_SERVER["DOCUMENT_ROOT"] . "views/";
    }

    public function getDefaultViewDirectory()
    {
        return $this->defaultViewDirectory;
    }
}

或者你可以实现像:

这样的Singleton模式
class View
{
    private $defaultViewDirectory;

    private function initDefaultViewDirectory()
    {
        $this->defaultViewDirectory = $_SERVER["DOCUMENT_ROOT"] . "views/";
    }

    public function getDefaultViewDirectory()
    {
        if (is_null($this->defaultViewDirectory)) {
            $this->initDefaultViewDirectory();
        }
        return $this->defaultViewDirectory;
    }
}

或者如果您需要静态访问:

class StaticView
{
    private static $defaultViewDirectory;

    private static function initDefaultViewDirectory()
    {
        self::$defaultViewDirectory = $_SERVER["DOCUMENT_ROOT"] . "views/";
    }

    public static function getDefaultViewDirectory()
    {
        if (is_null(self::$defaultViewDirectory)) {
            self::initDefaultViewDirectory();
        }
        return self::$defaultViewDirectory;
    }
}

所以你可以致电StaticView::getDefaultViewDirectory()