требуется файл lang в MVC php - PullRequest
       0

требуется файл lang в MVC php

1 голос
/ 22 марта 2012

В главном окне у меня есть эта функция

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.php и в home.php Я вижу массив.Итак, файл загружен, но почему я не могу его использовать home.php?

Ответы [ 4 ]

4 голосов
/ 22 марта 2012
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 голос
/ 22 марта 2012

Это потому, что область, в которую вы добавляете переменную, является только функцией 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. Если вы хотите кэшировать больше одного языка содержимого файла, вам нужно создать двумерный массив и сохранить его там.

0 голосов
/ 22 марта 2012

Попробуйте это в home.php:

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

и это

public function lang($file, $language){
    return require 'languages/'.$language.'/'. $file . '.php'; 
}
0 голосов
/ 22 марта 2012

Проблема в том, что вы загружаете файл 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');

Выводить необработанные переменные в глобальную область видимости, как это не всегда лучшая идея, но в зависимости от обстоятельств (небольших проектов) это может быть хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...