在常量中添加变量

时间:2012-10-09 16:20:10

标签: php string variables const

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

我的大部分常量都是这样的:

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

5 个答案:

答案 0 :(得分:7)

如果定义常量,则无法进行此操作。

  

手动:&#34;值必须是常量表达式,而不是(例如)变量,属性,数学运算的结果,   或函数调用。&#34;

Constant Manual php.net
Constant Expression

答案 1 :(得分:5)

这不起作用,因为常量(顾名思义)需要保持不变,但你可以使用printf()解决它。

示例:

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

然后在你的视图脚本中:

printf(SUCCESSFULLY_REGISTERED, $this->cssClassSuccess);

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

的值

答案 2 :(得分: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。这是因为在类中定义的常量是伪类常量,类似于作用域绑定到的上下文的静态变量。由于常量不能更改,并且它们的范围与类绑定,因此调用上面的错误行本质上是试图重新定义&#34;常数,如您所知,将导致上述错误。

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

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

答案 3 :(得分:0)

动态生成常量的唯一方法是使用如下所示的define函数。但正如另一个答案所指出的,这不是一个阶级不变的。

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

从那一点开始的常量可以用SUCCESSFULL_REGISTERED来引用,并且是不可变的。

答案 4 :(得分: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();