2016-07-31 3 views
1

Я строю простую многоязычную систему. Я создал класс с именем языка, который загружается на мой контроллер, класс очень прост:Невозможно получить переменную другого файла php

class Language 
{ 
    private $_langPath = null; 

    function __construct() 
    { 
     $this->_langPath = 'languages/' . LANGUAGES . '/trans_mig.php'; 

     if(!file_exists($this->_langPath)) 
     { 
      throw new exception("File not found: " . LANG); 
     } 
     else 
     { 
      include $this->_langPath; 
     } 
    } 

    public function line($key) 
    { 
     return $lang[$key]; 
    } 
} 

внутри trans_mig.php я следующее:

$lang['home'] = 'Home'; 
$lang['user'] = 'User'; 

, но когда я, например, это:

$this->lang->line('user'); 

Я получаю следующее сообщение об ошибке:

Notice: Undefined variable: lang

в файле, который я включил trans_mig.php, что я делаю неправильно?

+1

'$ lang' определена вне класса. В классе 'Language' нет свойства' $ lang', поэтому вы не можете получить к нему доступ с '$ this'. [Область переменной] (http://php.net/manual/en/language.variables.scope.php). – FirstOne

ответ

2
public function line($key) 
{ 
    return $lang[$key]; 
} 

В данной функции вы не определяете $lang. Таким образом, из-за variable scope, он не определен в вашей функции.

Что вы должны сделать, это определить $lang в пределах своего класса и вытащить переменную из включаемых

class Language 
{ 
    private $_langPath = null; 
    /** @var array */ 
    protected $lang; 

    function __construct() 
    { 
     $this->_langPath = 'languages/' . LANGUAGES . '/trans_mig.php'; 

     if(!file_exists($this->_langPath)) 
     { 
      throw new exception("File not found: " . LANG); 
     } 
     else 
     { 
      include $this->_langPath; 
     } 
     $this->lang = $lang; 
    } 

    public function line($key) 
    { 
     return $this->lang[$key]; 
    } 
} 
+1

@FirstOne В OP, '$ lang' определен в' trans_mig.php' include, который находится в конструкторе – Machavity

+0

Да, теперь отлично работает, я не видел, что эта практика может работать. Спасибо :) –

+0

Другой вариант, в вашем include, вы можете добавить 'return $ lang;' в конце, тогда вы можете сделать '$ this-> lang = include $ this -> _ langPath;', избегая переменного загрязнения (иногда это может быть проблемой) – rjdown

Смежные вопросы