【问题标题】:Using a const in const在 const 中使用 const
【发布时间】:2014-08-26 07:51:37
【问题描述】:

我有一点需要生成脚本的 php。其中一部分几乎是静态的,但数据是动态生成的。我曾经在另一种语言中遇到过类似的问题,并使用常量替换解决了它。

我正在尝试做的事情:

interface IConstants {
    const SUBSTITUTE = '!substitute';
    const FULL_STRING = 'var data = "' . self::SUBSTITUTE . '";';
}

class Util {
    public static function replace($haystack, $needle, $replace) {
    // implementation
    }
}

class SampleClass {
    public function getScript() {
        $someData = $this->getData();
        return Util::replace(IConstants::FULL_STRING, IConstants::SUBSTITUTE, $someData);
    }

    public function getData() {
        // generate $someData
        return $someData;
    }
}

PHP 是否接受这种设计?如果是,我将如何实现它,如果不是,什么是合适的替代方案?

【问题讨论】:

  • 你可以使用define("FOO",value)
  • 是的。你能行的。为什么你没有尝试。
  • @Asuraya Eclipse 给出了一个语法错误:unexpected '.'
  • “我有一个类似的问题” - 你介意告诉我们实际的问题是什么吗?
  • @KarolyHorvath 我不太确定它是什么,但我认为它涉及将翻译后的文本注入其他内容。当前的问题是无法从多个部分中定义类常量(意外的“.”)。

标签: php design-patterns constants


【解决方案1】:

这在 PHP 中是不可能的,至少在 5.4.4 中是不可能的,这与 Java 不同。

docs 这么说:

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

一个简单的尝试:

$ php -r 'const FOOBAR = "AF" . "A". "R"; '
PHP Parse error:  syntax error, unexpected '.', expecting ',' or ';' in Command line code on line 1

与:

$ php --version
PHP 5.4.4-14+deb7u14 (cli) (built: Aug 21 2014 08:36:44) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies

对于全局常量,可以使用define

【讨论】:

    【解决方案2】:

    替换发生在字符串上,因此被接受。但是,您收到的错误是由于 PHP 缺少常量表达式。 IE。您不能编写使用另一个常量的常量。唯一可接受的语法是当第二个常量等于第一个常量时。

    这已经改变了,但仅在最新的 PHP 5.6 中,它还不稳定:http://php.net/manual/en/migration56.new-features.php#migration56.new-features.const-scalar-exprs

    【讨论】:

    • 为什么我还不能使用的版本中所有最好的功能!无论如何,谢谢,如果我可以使用它,这将是我正在寻找的。​​span>
    【解决方案3】:

    在 5.6 之前的 PHP 版本中,您不能这样做。在这些版本的 PHP 中,从组成部分构建常量的唯一方法是使用 define()。我必须查一下才能确定,但​​我认为您不能使用 define() 来定义类/接口常量。

    从 PHP 5.6 开始,您将能够像这样定义常量,但前提是它们是根据其他常量定义的。

    define() vs const

    【讨论】:

    • 谢谢。我将不得不重新阅读 define() 但如果我记得你可以在没有类修饰符的情况下访问这些常量,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    相关资源
    最近更新 更多