2013-08-16 34 views
2

我有一個接口,我試圖分配給smarty變量。在Smarty 3中增加了對班級內容的支持,並且我試圖利用它。smarty分配接口

namespace Application; 
interface ServerResponseCodes 
{ 
    const FAILURE = 0; 
    const SUCCESS = 1; 
    const PENDING = 2; 
    const INVALID = 3; 
} 

然後

$smarty->assign("codes", Application\ServerResponseCodes); 

拋出一個錯誤

Fatal error: Undefined constant 'Application\ServerResponseCodes' in /home/parvhraban/domains/src/www_root/clienttest.php on line 16

是不是可以從Smarty模板訪問接口consts?

是否有限制,我可以只分配初始化對象?

任何更好和更原生的解決方案,反射類?

$codes = new ReflectionClass ('Application\ServerResponseCodes'); 
$smarty->assign("codes", $codes->getConstants()); 

回答

1

這個錯誤不是與Smarty有關,也不是Smarty腳本生成它。這是一個PHP語法問題。

通常情況下,你必須使類的一個實例:

$smarty->assign("codes", new Application\ServerResponseCodes); 

不過你的情況,這將無法正常工作,接口不能對自己被實例化。要訪問代碼,我認爲你需要使用另一個實現這個接口的類。

class MyClass implements ServerResponseCodes {} 

$smarty->assign("codes", new MyClass); 

但是看到你的問題的更新,使用ReflectionClass似乎是一個更好的選擇。我確信有更好的選擇,但它需要更多的應用知識。在Smarty模板中需要這些值似乎很奇怪。

+0

我想避免對模板內部的幻數進行編碼。有一個ajax調用被髮送到服務器API,返回一個幻數,我想將接口傳遞給模板。那些神奇的數字在模板中使用恐怕 –

+0

我會給你帶來疑問的好處。但是,與您的問題有關,有多種解決方法。恐怕你不能直接訪問一個接口(使用PHP),除非它來自一個實現它的類,並且你不能通過它們的名字傳遞對類的引用,除非它是一個字符串值(或者是持有該類實例的變量)。我幾乎可以肯定,如果你使用一個沒有'new'的類名,它必須在後面使用'::'。 –

+0

爲什麼你不能只傳入相關的狀態碼?你的Smarty模板中有商業邏輯嗎? –