静态函数中包含文件的全局变量

时间:2015-03-05 09:20:46

标签: php global

我的 index.php 包含文件 strings.php ,用于翻译短语。在 strings.php 中包含基于用户语言的文件: $ lang.php 。此 $ lang.php 文件是从 $ lang.ini 自动生成的,包含单个数组:

  <?php $translation = array (
      'USER_PROFILE' => 'Uživatelský profil',
      'MESSAGES' => 'Zprávy',
      'NOTIFICATIONS' => 'Oznámení',
      'SETTINGS' => 'Nastavení',
      ...

strings.php 中的 $ lang.php 中有一个带有静态函数的字符串和全局分配的数组 $ translation

include_once('cache/'.$lang.'.php');

class Strings {
    static public function translate($string) {
        global $translation;
        ...
    }
}

translate()函数中的 $ translation 在这种情况下返回null。如果我在 index.php 中包含 $ lang.php 它突然有效,但如果我在其他文件中调用 Strings :: translate()函数, $ translation 再次返回null。我不明白这种行为。 (对不起,英文)

1 个答案:

答案 0 :(得分:2)

因为包含文件$lang.php的方式,变量$translation作为函数中的局部变量而不是global变量,因为方法Strings::translate()期望它

我们在聊天中讨论过后,我理解了这个问题,我可以提出两个解决方案:

解决方案1(快速解决方法)

更改档案$lang.php

<?php global $translation = array (
    'USER_PROFILE' => 'Uživatelský profil',
    ...

这样变量$translation就在全局上下文中创建,一切都按预期工作。

解决方案2(更好的设计)

限制变量$translation的范围。

档案$lang.php

<?php return array (
    'USER_PROFILE' => 'Uživatelský profil',
    ...

这样就不会创建变量(既不是本地变量也不是全局变量),这就消除了混淆的来源。

档案strings.php

class Strings {

    static $translation;

    static private function initialize() {
         global $lang;
         static::$translation = include_once('cache/'.$lang.'.php');
    }

    static public function translate($string) {
        if (! isset(static::$translation)) {
            static::initialize();
        }

        // use static::$translation instead of global $translation
    }
}

解决方案3(正确的设计)

更好的设计(实际上是正确的设计)是将方法initialize()设为公开,将$lang更改为参数,并在确定{的值后立即从代码中调用它{1}}。

档案$lang

strings.php