【问题标题】:how to define a constant member of a class with $_SERVER superglobals?如何使用 $_SERVER 超全局变量定义类的常量成员?
【发布时间】:2016-12-31 18:58:15
【问题描述】:

我有这个代码

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

但是,它给了我语法错误

解析错误:解析错误:语法错误,第 17 行 C:\xampp\htdocs\classes\View.class.php 中出现意外的“$_SERVER”(T_VARIABLE)

我检查了manual,它说

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

有什么办法可以做我想做的事吗?,因为我在类中大量使用了这个值,并且把它作为一个常量会使类更漂亮

【问题讨论】:

    标签: php


    【解决方案1】:

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

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

    或者你可以实现一个像这样的单例模式:

    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()

    【讨论】:

    • 谢谢。这很有帮助。但不幸的是,我需要在静态方法中使用常量,所以像你这样的实例变量在静态方法中是不可引用的。我对你的回答投了赞成票,但我不能接受,因为它没有解决我的问题。非常感谢您的宝贵时间。
    • 很公平 :) 感谢您的投票,我已经更新了答案以演示静态访问;)
    • 谢谢。看起来php不会让我完全按照我想要的方式去做。我从 C 语言中知道常量不能有变量数据,因为编译器需要知道生成操作码的值。但我认为 php 在这一点上可能很灵活,因为它是在运行时解析的(当变量数据准备好时)。谢谢你的时间:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多