0
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”只能由类“Constants”访问。

替代解决方案最受欢迎,因为在此解决方案中我需要创建两个类。我也想把变量作为一个变量而不是作为一个函数来访问,我希望它像静态一样被访问

4

3 回答 3

1

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

于 2013-04-12T04:45:47.063 回答
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");

那么你就不需要指定类访问器了,只需要根据需要使用URL1orURL2即可。

于 2013-04-12T04:42:08.663 回答
0

通常,如果不调用类方法,就无法声明动态常量和静态属性。但是你可以实现你想要的逻辑。您应该在字符串常量中使用占位符。然后你应该添加静态方法“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');
于 2013-04-12T06:38:35.203 回答