2

我在视图中为我的错误消息使用常量,并且我希望能够在其中使用变量以便于管理。

我的大部分常量看起来像这样:

const SUCCESSFULLY_REGISTERED = "<p class='success'>Registration successful!.</p>";

我想要做的是为 css 类使用一个变量,以便更容易在一个地方更改它们。这是我尝试过的:

const SUCCESSFULLY_REGISTERED = "<p class='$this->cssClassSuccess'>Registration successful!.</p><p>Log in with the username and password you registered with.</p>";

由于某种原因,它不起作用并引发下面的错误消息。为什么会这样以及如何以一种有效的方式来完成?

Parse error: syntax error, unexpected '"' in .../View/RegisterView.php on line 15
4

5 回答 5

7

如果您定义一个常量,这是不可能的。

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

常量手册 php.net
常量表达式

于 2012-10-09T16:24:33.187 回答
5

这不起作用,因为常量(顾名思义)需要保持不变,但您可以使用printf().

例子:

const SUCCESSFULLY_REGISTERED = '<p class="%s">Registration successful blah blah blah!</p>'

然后在您的视图脚本中:

printf(SUCCESSFULLY_REGISTERED, $this->cssClassSuccess);

常量中的%s将被替换为$this->cssClassSuccess

于 2012-10-09T16:27:27.017 回答
1

手册:从 PHP 5.3.0 开始,可以使用变量来引用类。

检查以下类:

<?php

class A{

    function __construct($v)
    {
        define("MyConstant",$v);
        echo "MyConstant is ". MyConstant;
    }
}

$a = new A("hello"); //will print MyConstant is hello
?>

在上面的代码中,我们将变量 ($v) 的值分配给常量 MyConstant。它不会给出错误,运行此函数的结果将是MyConstant is hello

但是,假设您添加了一个新行,如下所示:

$a = new A("hello"); //will print MyConstant is hello
$b = new A("New Value"); //will generate Constant MyConstant already defined notice..

在这里,该行将$b = new A("New Value");发出一条通知,说明:Notice: Constant MyConstant already defined. 这是因为在类中定义的常量是伪类常量,就作用域所绑定的上下文而言,类似于静态变量。而且由于常量无法更改,并且它们的范围绑定到类,调用上面的错误行本质上是试图“重新定义”常量,正如您所知,这将导致上述错误。

话虽如此,请记住,如果您使用define在类中创建常量,则它不是纯类常量 - 您不能将其称为A::MyConstant. 同时,如果您已经完成const AnotherConstant = "Hey";Class A您可以将其称为A::AnotherConstant. 但是,当const用于创建常量时,您不能将其值设置为变量。

我希望这可以更清楚地说明动态变量如何可以和不能分配给常量。

于 2012-10-09T16:29:51.060 回答
0

问题:投射自定义消息并传递变量以便于管理
解决方案:使用装饰器模式

interface HtmlElementInterface {
    public function getText();
    public function render();
}

class DivDecorator implements HtmlElementInterface {
    protected $innerHtml;
    protected $class;
    public function __construct($class = null, $innerHtml = null) {
        $this->innerHtml = $innerHtml;
        $this->class = $class;
    }

    public function getText() {
        return $this->text;
    }

    public function render() {
        return "<div class='{$this->class}'>" . $this->innerHtml . "</div>";
    }

}

$message = "Error in the app";
$div = new DivDecorator("myclass", $message);
echo $div->render();
于 2012-10-13T05:51:13.843 回答
0

动态生成常量的唯一方法是使用下面的定义函数。但正如另一个答案指出的那样,这不会是类级别的常量。

define('SUCCESSFULLY_REGISTERED', "<p class='$this->cssClassSuccess'>Registration successful!.</p><p>Log in with the username and password you registered with.</p>");

从那时起的常量可以用 SUCCESSFULL_REGISTERED 引用,并且是不可变的。

于 2012-10-09T16:29:59.797 回答