常量var在类类中

时间:2013-04-12 04:39:19

标签: php class

class Constants
{
        public static $url1      = "http=//url1";
        public static $url2       = Constants::$url1."/abc2";
        public static $url3       = Constants::$url1."/abc3";
        public static $url4       = Constants::$url1."/abc4";
}

我知道这是不可能的

所以我应该喜欢在一个地方使用$ url1定义

class urlOnly
{
      public static $url1      = "http=//url1";
}
class Constants
{
        public static $url1       = urlOnly::$url1;
        public static $url2       = urlOnly::$url1."/abc2";
        public static $url3       = urlOnly::$url1."/abc3";
        public static $url4       = urlOnly::$url1."/abc4";
}

此外,如果我想这样使用,我可以确保该课程" urlOnly"只能通过课程"常数"。

访问

备受欢迎的解决方案最受欢迎,因为在此解决方案中我需要创建两个类。 此外,我想仅将变量作为变量访问而不是作为函数访问,我希望像静态

一样访问它

3 个答案:

答案 0 :(得分:1)

您不能在类定义中使用非标量值。 请改用define()

答案 1 :(得分:0)

你能做到的一件事就是:

class Constants {
    public static $url1 = "http://url1";
    public static $url2 = "";
    // etc
}

Constants::$url2 = Constants::$url1 . "/abc2";

不幸的是,为了动态定义静态值,你必须在类的上下文之外这样做,因为静态变量只能用文字或变量初始化(因此这个答案的先前版本有一个解析错误)。

但是,我建议使用define,因为它的目的是定义常量值,并且没有理由将常量存储在类的上下文中,除非这样做是绝对有意义的(至少在我看来。)

类似的东西:

define("URL1", "http:://url1");
define("URL2", URL1 . "/abc2");

然后您无需指定类访问者,只需根据需要使用URL1URL2

答案 2 :(得分:0)

通常,如果不调用类方法,就无法声明dynamicaly常量和静态属性。但是你可以实现你想要的逻辑。 您应该在strirngs常量中使用占位符。然后你应该添加静态方法“get”来检索常量和替换占位符。像这样:

class Constants
{
    protected static $config = array(
        'url1' => 'http=//url1',
        'url2' => '%url1%/abc2',
        'url3' => '%url1%/abc3',
        'url4' => '%url1%/abc4',
    );

    public static function get($name, $default = null)
    {
        if (!empty(self::$config[$name]) && is_string(self::$config[$name]) && preg_match('/%(\w[\w\d]+)%/', self::$config[$name], $matches)) {
            self::$config[$name] = str_replace($matches[0], self::$config[$matches[1]], self::$config[$name]);
        }
        return self::$config[$name];
    }
}

使用方法:

Constants::get('url1');
Constants::get('url2');
Constants::get('url3');
Constants::get('url4');