【问题标题】:Constants var inside a class class [duplicate]类中的常量var [重复]
【发布时间】:2013-04-04 11:56:25
【问题描述】:
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”访问。

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

【问题讨论】:

  • 这并不能解决您的实际问题。 public static $foo = self::$bar 工作得很好;你只是不能在static 声明中连接东西。
  • 正如我所说,我不想创建对象或调用函数,所以它不重复
  • 那我不知道你在问什么。您不能按照您的方式动态声明类常量。链接的欺骗显示了一种解决方法。接受它或提出不同的问题。
  • 当您实际上可以单独创建这些静态变量而不必使用 Paamayim Nekudotaim 时,我不明白这一点。:P

标签: php class


【解决方案1】:

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

【讨论】:

  • 可以使用“非标量”值(例如array(...)),但不能使用非静态值。
  • 谢谢。我ll check. 1 + 2); } ?>` 仍然导致错误。但<?php class a { public $a = array(1); } ?> 工作正常。所以不允许表达,对吗?
  • 没错,非静态值(即任何需要执行和计算的东西)都不起作用。
【解决方案2】:

您可以做一件事来实现您正在寻找的东西:

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即可。

【讨论】:

  • 为什么这被否决了??
  • 我同意它不应该被否决.....但是它给出错误解析错误:语法错误,意外'。',期待','或';'
  • 而 ^ 是它被否决的原因。
  • @SheldonCooper 好名字,并修复了答案和示例。感谢您为我捕捉它,我应该在发布之前进行测试。以前从未在 PHP 中遇到过这种情况,所以我学到了一些新东西。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 2013-11-19
    • 2020-08-13
    • 2013-08-23
    • 2017-04-20
    • 2020-12-20
    • 2013-05-17
    • 1970-01-01
    相关资源
    最近更新 更多