beklendiği gibi php global değişkenler çalışmıyor

6 Cevap php

Ben php global değişkenler ile sorun yaşıyorum. Ben bir initSession çağıran başka bir dosya () başka bir dosyada tanımlanmış gerektiren bir dosyada bir $ ekran var dizi var. InitSession () "global $ ekranı" bildirir ve daha sonra ilk komut set değerini kullanarak aşağı $ ekranını işler.

Bu nasıl mümkün olur?

), Işler daha da karmaşık hale Eğer $ ekranı ayarlamaya çalışırsanız, sonra tekrar (initSession aramak için, ilk kez kullanılan değerini kullanır. Aşağıdaki kod anlatacağız. Birisi bu açıklayan gitmek olabilir?

$screen = "list1.inc";            // From model.php
require "controller.php";         // From model.php
initSession();                    // From controller.php
global $screen;                   // From Include.Session.inc  
echo $screen; // prints "list1.inc" // From anywhere
$screen = "delete1.inc";          // From model2.php
require "controller2.php"         
initSession();
global $screen;
echo $screen; // prints "list1.inc"

Update:
If I declare $screen global again just before requiring the second model, $screen is updated properly for the initSession() method. Strange.

6 Cevap

Global değişken küresel hale ETMEZ. Ben zor :-) biliyorum

Global, yerel bir değişken as if it was a variable with a higher scope kullanılacak olacağını söylüyor.

Örn:

<?php

$var = "test"; // this is accessible in all the rest of the code, even an included one

function foo2()
{
    global $var;
    echo $var; // this print "test"
    $var = 'test2';
}

global $var; // this is totally useless, unless this file is included inside a class or function

function foo()
{
    echo $var; // this print nothing, you are using a local var
    $var = 'test3';
}

foo();
foo2();
echo $var;  // this will print 'test2'
?>

Küresel vars nadiren iyi bir fikir olduğunu unutmayın. Onlar olmadan zaman 99.99999% kod olabilir ve kod bulanık kapsamları yoksa korumak için çok daha kolaydır. Kaçının global if you can.

global $foo "herkes bunu kullanabilirsiniz böylece, bu değişken küresel yapmak" anlamına gelmez. global $foo araçlar "within the scope of this function, küresel değişkeni $foo kullanın".

Ben her zaman, bir fonksiyon içinde $ ekrana başvuruyorsunuz sizin örnek varsayarak yaşıyorum. Böylece her bir fonksiyonun global $screen kullanmak gerekir eğer.

Sen sadece her dosyanın üstünde, onu başvuruyor her işlev "global $ ekranı" koymak gerekir.

Eğer birçok işlevlerini kullanan bir görev sırasında erişmek istediğiniz değişkenler bir sürü varsa, bir şeyler tutmak için bir 'bağlam' nesnesi yapmayı düşünün:

//We're doing "foo", and we need importantString and relevantObject to do it
$fooContext = new StdClass(); //StdClass is an empty class
$fooContext->importantString = "a very important string";
$fooContext->relevantObject = new RelevantObject();

doFoo($fooContext);

Şimdi sadece tüm fonksiyonlara bir parametre olarak bu nesneyi geçmek. Global değişkenleri gerekmez, ve işlev imzalar temiz kalır. Daha sonra aslında ilgili yöntemleri vardır bir sınıf ile boş stdclass değiştirmek de kolay.

Küresel kapsamı açıklıklı dahil ve dosyaları gerekli bir fonksiyon içinde değişken kullanarak sürece küresel anahtar kelime kullanmak gerekmez. Yerine $ GLOBALS dizi kullanarak deneyebilirsiniz.

Eğer küresel bir değişken daha önce bunun için değerleri tanımlamak bildirmeniz gerekir.