使用PHP中的define / apc_define_constants取消定义常量

时间:2010-02-07 14:33:43

标签: php constants

我正在使用不同语言的输出消息的常量。 例如,如果用户选择“英语”,则需要具有此常量的文件:

define('welcomeMessage','Welcome!');

如果她选择“西班牙语”:

define('welcomeMessage','Bien Venidos!');
等等......

当用户迭代语言时会出现问题。我不能用define / apc_define_constants重新定义常量(据我所知)。我可以删除并重新定义它们吗?

这有一个很好的解决方案吗?

5 个答案:

答案 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()函数。这样可以更容易地将设置与变量分开。我主要在部分视图中使用它,我需要一个具有全局范围的变量(如常量),但能够随时重新定义它。

希望它对你有所帮助。