我在视图中使用常量作为我的错误消息,我希望能够在其中使用变量以便于管理。
我的大部分常量都是这样的:
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
答案 0 :(得分:7)
如果定义常量,则无法进行此操作。
手动:&#34;值必须是常量表达式,而不是(例如)变量,属性,数学运算的结果, 或函数调用。&#34;
答案 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();