代码之家  ›  专栏  ›  技术社区  ›  Gal

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

  •  1
  • Gal  · 技术社区  · 16 年前

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

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

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

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

    等…

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

    有没有好的解决办法?

    5 回复  |  直到 10 年前
        1
  •  4
  •   cletus    16 年前

    Constants 创建与 define() 创建后不能定义。

    常量创建时使用 apc_define_constants() 可以通过向函数传递空数组来移除。

    但我不确定我是否理解为什么这是一个问题。“用户迭代语言”是什么意思?一旦一个请求返回给用户,并且他们生成了一个新的请求(通过重定向、提交表单、单击链接或生成Ajax请求),那么您就可以自由地定义您在新调用中喜欢的任何常量。

    除非问题是您定义了常量,然后调用代码来设置新的语言/消息,这将触发设置所有常量的尝试(将失败 定义() )。

        2
  •  5
  •   wpjmurray    16 年前

    如果以后可以更改某个常量,那么使用该常量是没有意义的。我建议创建一个静态类,您可以在其中设置语言,而不是使用常量,您将从该类收到欢迎消息。我们假设该类名为lang:

    Lang::setLang('spanish');
    Lang::getWelcome();
    

    getwelcome()方法检查用set lang()设置的lang值,并返回适当的转换字符串。

    使用静态类意味着您不必实例化该类,并且所有其他代码都可以引用该静态类,而无需创建新实例,也无需设置所使用的语言。

        3
  •  0
  •   grateful.dev    16 年前

    我不知道用户在运行时是如何更改语言的,但是在运行时不应该修改或重新定义常量。
    考虑使用全局变量。

        4
  •  0
  •   mr-sk    16 年前

    您不应该将语言定义为常量。有很多更灵活的方法,比如将它们放入语言类、数据库甚至本地文件中。在代码中使用它们是不好的。

    语言类应该抽象掉所有的细节。

    $language = new Language('english');
    $welcomeString = $language->get('welcomeMessage');
    ....
    $language = new Language('spanish');
    $welcomeString = $language->get('welcomeMessage');
    

    传递给语言构造函数的参数仍然可以是一个define,与get()参数一起使用,但是实际的语言文本不应该存在于代码中,我将把它保存在数据库中。

        5
  •  0
  •   Denis Pshenov    15 年前

    以下是我需要重新定义“常量”时所做的操作(听起来很有趣):

    // 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()函数。这使得从变量中分离设置更加容易。我主要在局部视图中使用它,在局部视图中,我需要一个具有全局范围的变量(比如常量),但是可以随时重新定义它。

    希望对你有帮助。