我正在使用不同语言的输出消息的常量。 例如,如果用户选择“英语”,则需要具有此常量的文件:
define('welcomeMessage','Welcome!');
如果她选择“西班牙语”:
define('welcomeMessage','Bien Venidos!');
等等......
当用户迭代语言时会出现问题。我不能用define / apc_define_constants重新定义常量(据我所知)。我可以删除并重新定义它们吗?
这有一个很好的解决方案吗?
答案 0 :(得分:5)
如果稍后可以更改值,则使用常量是没有意义的。我建议创建一个静态类,您可以在其中设置语言,而不是使用常量,您将从该类获得欢迎消息。让我们说这个班叫Lang:
Lang::setLang('spanish');
Lang::getWelcome();
getWelcome()方法检查使用setLang()设置的lang值,并返回相应的翻译字符串。
使用静态类意味着您不必实例化该类,并且所有其他代码都可以引用该静态类,而无需创建新实例并且必须设置所使用的语言。
答案 1 :(得分:4)
Constants创建时使用define()
创建后无法定义。
通过将空数组传递给函数,可以删除使用apc_define_constants()
创建的常量。
我不确定我理解为什么这是一个问题。你是什么意思“用户迭代语言”?一旦请求返回给用户并且他们生成新请求(通过重定向,提交表单,单击链接或生成AJAX请求),您就可以自由地在新调用中定义您喜欢的任何常量。 / p>
除非问题在于您定义常量然后调用代码来设置新语言/消息,这会触发尝试设置所有常量(将使用define()
失败)。
答案 2 :(得分:0)
我不知道用户在运行时如何更改语言,但在运行时不应修改或重新定义常量 考虑使用全局变量。
答案 3 :(得分:0)
您不应将您的语言定义为常量。有更灵活的方法,比如将它们放在语言类,数据库甚至本地文件中。在代码中使用它们很糟糕。
语言课应该抽象出所有细节。
$language = new Language('english');
$welcomeString = $language->get('welcomeMessage');
....
$language = new Language('spanish');
$welcomeString = $language->get('welcomeMessage');
传递给语言构造函数的参数仍然可以是一个定义,沿着get()参数,但实际的语言文本不应该存在于代码中,我会将其粘贴在数据库中。
答案 4 :(得分:0)
当我需要重新定义的“常量”(听起来很有趣)时,我就会这样做:
// somewhere in your global file
function config($key, $value) {
$GLOBALS[$key] = $value;
}
function conf($key) {
return $GLOBALS[$key];
}
function configured($key) {
return isset($GLOBALS[$key]);
}
现在,只要您需要定义“常量”,只需使用:
config('SHOW_AVATAR', true);
当您需要访问它时,请使用:
if(conf('SHOW_AVATAR') === true)
echo "AVATAR";
如果您需要检查它是否已经定义,请使用:
if(configured('SHOW_AVATAR'))
echo "Setting set";
为什么我使用它?因为它在我的代码中看起来像define()函数。这样可以更容易地将设置与变量分开。我主要在部分视图中使用它,我需要一个具有全局范围的变量(如常量),但能够随时重新定义它。
希望它对你有所帮助。