2012-10-09 29 views
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 
+0

常數=變量;!因此你不能添加動態內容到常量... – feeela

+0

好吧,不知道。 – holyredbeard

+0

那麼,正如@Mike寫道:「常量(顧名思義)需要不變」 – feeela

回答

7

這是不可能的,如果你定義一個常量。

手冊:「的值必須是常量表達式,而不是(例如)一個變量,屬性,數學運算, 或函數調用的結果。」

Constant Manual php.net
Constant Expression

+0

好的,謝謝你的信息! – holyredbeard

+0

是沒問題;) – Stony

+0

@holyredbeard:你的問題是否回答?那麼你應該標記一個答案是正確的。 – Stony

5

這不會起作用,因爲常數(顧名思義)必須是恆定的,但你可以解決它與printf()

例子:

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

,然後在視圖腳本:

printf(SUCCESSFULLY_REGISTERED, $this->cssClassSuccess); 

在不斷的%s$this->cssClassSuccess

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 
?> 

在上面的代碼我們指定給恆定MyConstant一個可變(V $)的值。它不會給一個錯誤,這個函數運行的結果將是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。同時,如果您在Class A中完成了const AnotherConstant = "Hey";,則可以將其稱爲A::AnotherConstant。但是,使用const創建常量時,不能將其值設置爲變量。

我希望這可以更好地瞭解動態變量如何能夠和不能被分配給常量。

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引用,並且是不可變的。

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();