PHP-переменные заканчиваются NULL (но работает код)!

Для изменения языка на моем сайте я использую следующий код :

<?php session_start(); header('Cache-control: private'); // IE 6 FIX function get_lang(){ if(!empty($_GET['lang'])) return $_GET['lang']; if(!empty($_SESSION['lang'])) return $_SESSION['lang']; if(!empty($_COOKIE['lang'])) return $_COOKIE['lang']; return 'en'; } function set_lang($lang){ setcookie("lang", $lang, time() + (3600 * 24 * 30)); $_SESSION['lang'] = $lang; } function get_lang_file($lang){ $lang_file = "languages/lang.$lang.php"; if(file_exists($lang_file)) return $lang_file; if($lang_file = get_lang_file('en')) return $lang_file; return false; } //translation helper function function l($string){ static $translation; if(!isset($translation)){ $lang = get_lang(); $lang_file = get_lang_file($lang); if($lang_file) set_lang($lang); $translation = include $lang_file; } return $translation[$string]; } 

?>

Я хочу добавить Javascript-файл в соответствии со значением одной из переменных, в этом случае $lang_file :

  <?php if($lang_file=='lang.en.php') {echo ' <script type="text/javascript" src="scripts/jquery-validate/val-en.js"></script>';} ?> <?php if($lang_file=='lang.es.php') {echo ' <script type="text/javascript" src="scripts/jquery-validate/val-es.js"></script>';} ?> <?php if($lang_file=='lang.tw.php') {echo ' <script type="text/javascript" src="scripts/jquery-validate/val-tw.js"></script>';} ?> <?php if($lang_file=='lang.cn.php') {echo ' <script type="text/javascript" src="scripts/jquery-validate/val-cn.js"></script>';} ?> 

Но это не работает, потому что все переменные становятся NULL в конце (но работает код).

Я тестировал его с этим, и он говорит NULL NULL NULL NULL :

 var_dump($translation); var_dump($lang); var_dump($string); var_dump($lang_file); 

Какие-либо предложения?

EDIT: образец Javascripts, который я val-xx.js ( val-xx.js ):

 $(document).ready(function(){ $("#sendmail").validate({ rules: { FieldData0: { required: true }, FieldData1: { required: true, email: true }, FieldData2: { required: true } }, messages: { FieldData0: { required: "Please enter your name" }, FieldData1: { required: "Please enter your email address" }, FieldData2: { required: "Please enter a message" } } }); }) 

образец lang.$lang.php file:

 <?php return array( 'tagline_h2' => '我创造简单...', (and so on) 

Solutions Collecting From Web of "PHP-переменные заканчиваются NULL (но работает код)!"

Похоже, вы жертва переменной сферы . Если вы хотите ссылаться на переменную, определенную в функции, вы должны объявить ее глобальной. Например:

 $lang_file = "languages/lang.en.php" //default function get_lang_file($lang){ global $lang_file; $lang_file = "languages/lang.$lang.php"; if(file_exists($lang_file)) return $lang_file; if($lang_file = get_lang_file('en')) return $lang_file; return false; } 

ИЛИ (более правильно), просто используйте возвращаемое значение функции:

 if(get_lang_file($mylang) == 'blah') 

против

 if($lang_file == 'blah') 

Похоже, вы устанавливаете $lang_file в "languages ​​/ lang. $ Lang.php". В вашей эхо-строке вы должны использовать следующее:

<?php if($lang_file=='languages/lang.en.php') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-en.js"></script>';} ?>

Ваши функции очень хорошо определены, но они никогда не запускаются, если вы ничего не упускаете. Даже тогда выживут только те значения, которые returned из функции, переменные внутри функции недействительны вне ее.

$translation статичен, а все остальные являются локальными, поэтому ни один из них не доступен в глобальной области. Они не «становятся» NULL, их просто не существует (поэтому PHP думает, что вы ссылаетесь на новые переменные).

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

Переменные в функциях находятся в «локальной области», которые нельзя использовать в «глобальной области». Пожалуйста, обратитесь к ответу Бенджамина Маннса.

Короче говоря, вам нужен клей:
1. Использование глобальных переменных в функциях или
2. Используя блок кода для их склеивания или
3. Используя функцию обертки, аналогичную 2, чтобы она работала.

Пример кода блока (2)

// После функционального блока

$ lang = get_lang ();

set_lang ($ языки); // Для повторного посещения

$ lang_file = get_lang_file ($ lang);

if ($ lang_file! == FALSE)

{

  switch ($lang_file) { case 'lang.cn.php': echo ' <script type="text/javascript" src="scripts/jquery-validate/val-cn.js"></script>'; break; // Other cases } 

}