Php değişkenler NULL sonuna kadar (ama kod çalışır)!

5 Cevap php

Benim web dilini değiştirmek için following code kullanın:

<?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];
}

>

Bu durumda, değişkenlerin birinin değerine göre bir JavaScript dosyası eklemek istediğiniz $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>';} ?>

Tüm değişkenler sonunda NULL olmak (ama kod çalışır) çünkü Ama çalışmıyor.

Ben bu ile test edilmiş ve diyor NULL NULL NULL NULL:

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

Herhangi bir öneriniz?

EDIT: Ben arıyorum Javascriptleri örnek (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"
            }
        }
    });
})

a lang.$lang.php file: örnek bir

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

(and so on)

5 Cevap

Bu kurbanı konum gibi görünüyor variable scope. Bir fonksiyonun içinde tanımlanmış bir değişken başvurmak isterseniz küresel olarak bildirmek zorunda. Örneğin:

$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;
}

OR (daha doğru), sadece işlevler değerini döndürmek kullanın:

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

karşı

if($lang_file == 'blah')

Eğer $lang_file "dillerini / lang. $ Lang.php" kuruyoruz gibi görünüyor. Lütfen yankı dizesinde aşağıdaki kullanmalısınız:

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

Eğer bir şey ihmal sürece fonksiyonları, çok güzel tanımlanmış, ama aslında koşmak asla. O zaman bile, returned bir işlevi olan hayatta olurdu sadece değerler, bir işlev içinde değişkenleri bunun dışında geçerli değildir.

$translation statik ve geri kalan tüm yerel, böylece bunların hiçbiri genel kapsamda erişilebilir. Onlar NULL, onlar sadece yok "olmak" değil (yani PHP yeni değişkenlere atıfta sanıyor).

Temelde what Benjamin just said, karşılaştırma yapmak dışında size sadece get_lang() işlevini çağırarak edilmelidir yapıyor olmak istiyor gibi görünüyor.

Variables in functions are in its "local scope", which cannot be used in "global scope". Please refer Benjamin Manns's reply.

In short, you need a glue:
1. Using global variables in functions, or
2. Using a code block to glue them, or
3. Using a wrapper function similar to 2 to make it work.

Bir örnek kod bloğu (2)

/ / Sonra fonksiyon bloğu

$ Lang = get_lang ();

set_lang ($ lang); / / Ziyaret yinelenen için

$ 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

     }

}