在MVC php中需要lang文件

时间:2012-03-22 14:53:51

标签: php model-view-controller oop

在主视图中我有这个功能

public function lang($file, $language){
require 'languages/'.$language.'/'. $file . '.php'; 
}

然后在视图文件home.php中我有

$this->lang('global','en'); 

滞后文件global.php

$lang = array (
  'title' => 'mySite',
);

现在在home.php如果我使用print_r($lang);没有任何反应。我在global.phphome.php中的数组下方复制并粘贴了相同的脚本,我看到了数组。所以文件已加载,但为什么我不能使用它home.php

4 个答案:

答案 0 :(得分:4)

public function lang( $file, $language)
{
    require_once("languages/{$language}/{$file}.php");

    return $lang;
}

$lang = $this->lang('global','en');
print_r($lang);

我建议缓存结果,然后以这种方式访问​​。

var $cache = array();

public function lang( $file, $language)
{
    if( !isset( $this->cache[$language][$file] ) )
    {
        require_once("languages/{$language}/{$file}.php");
        $this->cache[$language][$file] = $lang;
    }

    return $this->cache[$language][$file];
}

$lang = $this->lang('global','en');
print_r($lang);

答案 1 :(得分:1)

这是因为添加变量的范围只是lang()函数。 如果你想要我们在函数之外,你必须将它设置为一些对象变量。

以下是我要做的更改:

  • global.php

    return array(
        'title' => 'Sitename something'
    );
    
  • 并在函数中:

    public function lang($file, $language)
    {
      if ( empty($this->translations ))
      {
        $this->translation = include 'languages/'.$language.'/'. $file . '.php'; 
      }
    }
    

现在,您应该能够在$this->translations变量中看到该文件的内容。如果要缓存更多文件内容的一种语言,则必须创建一个二维数组,并将其存储在那里。

答案 2 :(得分:0)

问题是你是从函数内部加载lang文件,这意味着$lang不会被放入全局范围,而是放在本地函数范围内。

使其有效的最低要求变化(但不是一个好主意)

假设您希望将 $lang放在全局范围内,您可以明确地这样做:

public function lang($file, $language){
    require 'languages/'.$language.'/'. $file . '.php'; 
    $GLOBALS['lang'] = $lang; // "export" to global scope
}

更好的主意

有几件事可以改进:

  1. 上面的函数将全局变量$lang的内容写入调用者的后面“ - 这不是好设计,它使代码更难维护
  2. 就目前而言,每次调用时都会从头开始加载语言文件
  3. 您可以通过将语言文件内容存储在static局部变量中并从函数中返回来一举杀死两只鸟:不再写入全局范围,并且变量保留其内容您不必每次都重新加载语言文件。它看起来像这样:

    public function lang($file, $language){
        static $cache = array();
        if (empty($cache[$language][$file])) {
            // load language files on demand
            require 'languages/'.$language.'/'. $file . '.php'; 
            $cache[$language][$file] = $lang;
        }
    
        return $lang; // return requested data, which is now definitely cached
    }
    

    要使用它,你会这样做:

    $lang = $this->lang('global', 'en');
    

    将原始变量转储到全局范围内并不总是最好的想法,但根据具体情况(小项目)可能没问题。

答案 3 :(得分:0)

在home.php中试试这个:

$Lang = $this->lang('global','en');

和这个

public function lang($file, $language){
    return require 'languages/'.$language.'/'. $file . '.php'; 
}