【问题标题】:require lang file in MVC php在 MVC php 中需要 lang 文件
【发布时间】:2012-04-07 03:49:47
【问题描述】:

在主视图中我有这个功能

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

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

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

滞后文件 global.php

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

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

【问题讨论】:

    标签: php model-view-controller oop


    【解决方案1】:

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

    使其工作所需的最小更改(但不是一个好主意)

    假设你想要 $lang 被放置在全局范围内,你可以明确地这样做:

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

    更好的主意

    有几点可以改进:

    1. 上面的函数把全局变量$lang的内容写在“调用者的背后”——这不是很好的设计,而且会使代码更难维护
    2. 就目前而言,每次调用时它都会从头开始加载语言文件

    您可以通过将语言文件内容存储在 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');
    

    像这样将原始变量转储到全局范围并不总是最好的主意,但根据情况(小型项目)可能没问题。

    【讨论】:

    • 你真的不应该在 OOP 中使用$_GLOBALS。这是一种非常糟糕的做法。
    • @tereško:$_GLOBALS 和 Singleton 在概念上没有区别,这也被许多人认为是一种不好的做法。 OTOH,关于您的 OOP 参考,将数据封装在对象内(与全局与单例决策正交)以保护它始终是更好的工程 - 但同样,除非有一些好处(不太可能在小型项目中)盲目我不赞成选择“摩尔工程”。
    • 必须维护项目。全局状态的引入将意味着“摩尔维护”。特别是如果您在 6 个月后再次使用它并且不记得每个全局变量的设置位置。
    • 大声笑。有问题的是函数内部丑陋的“要求”,但乔恩在回答中建议添加 GLOBALS,以使代码变得更糟。这应该是个笑话。
    • 新版本要好得多(不过,我仍然会避免为此使用static)。 +1
    【解决方案2】:

    那是因为您添加变量的范围只有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 变量中看到该文件的内容。如果你想缓存更多的文件内容的一种语言,你将不得不创建一个二维数组,并将其存储在那里。

    【讨论】:

      【解决方案3】:
      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);
      

      【讨论】:

      • 非常感谢 MetalFrog :)
      【解决方案4】:

      在 home.php 中试试这个:

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

      还有这个

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-31
        • 2014-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        相关资源
        最近更新 更多