PHP bir küresel değişkeni erişimde sorun

6 Cevap php

Aşağıdaki kod parçası olduğunu:

function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
    require_once ($include_file);
//      global $flag;
//        echo 'in main global scope flag='.$flag;
    test();
   }
}

something();

exit;

 //in test.php

$flag = 4;
function test() {
   global $flag;

   echo '<br/>in test flag="'.$flag.'"';
   if ($flag) {
       echo 'flag works';
     //do something
   }
}

The above code snippet, echoes 'global scope' $flag value properly but doesnt recognises the $flag with value 4, assumes null value for $flag . Please point out what is wrong in accessing that $flag global variable.

Thanks in advance, Anitha

6 Cevap

$flag = 4; küresel kapsamında değildir.

If the include occurs inside a function within the calling file, then all of the code contained in the called file will behave as though it had been defined inside that function.

- PHP Manual de include_once için geçerlidir include için sayfa, ihtiyaç ve Require_once

Ben global $ bayrağı değişken bir değer atanmış olmamıştı çünkü bu noktada, $ bayrak, başlatılmamış olduğundan alıyoruz hata, if ($flag) hattı üzerinde olduğundan bir tahmin yapmak için gidiyorum.

Ayrıca {[(2 yapma yan etkisi vardır küresel kopya görüntülemek için bu işlevi bir global $flag; ihtiyaç olarak arada, echo 'global scope flag='.$flag;, ya da genel bayrağını göstererek değil )]} dahil dosyasında küresel kopyasını etkiler.

Sen yolu PHP şu anda dosya yorumluyor çünkü burada bir sorun yayınlanıyor. Bu fonksiyonları iç içe.

İşte kod şu anda yürütür nasıl:

function something() {
    $include_file = 'test.php';
    if ( file_exists($include_file) ) {
        //require_once ($include_file);

        $flag = 4;
        function test() {
           global $flag;

           echo '<br/>in test flag="'.$flag.'"';
           if ($flag) {
               echo 'flag works';
             //do something
           }
        }

        //end require_once ($include_file);

        test();
    }
}

something();

exit;

Eğer 4 $flag ($flag = 4) kadar değeri atamak zaman, gördüğünüz gibi, size fonksiyonu kapsamında olan {[(3)] } değil, küresel kapsamında.

Eğer $flag, o işlev içinde global olarak ilan beri test() olarak, $flag tüm senaryonun küresel tamamen farklı bir değişken vardır.

Bu sorunu önlemek için, superglobali $GLOBALS . It's faster than using global Neyse, ve yukarıda olanlar gibi konular kapsam karışmış alamadım bu şekilde kullanın:

function something() {
    $include_file = 'test.php';
    if ( file_exists($include_file) ) {
        //require_once ($include_file);

        $GLOBALS['flag'] = 4;
        function test() {
           global $flag;

           echo '<br/>in test flag="'.$GLOBALS['flag'].'"';
           if ($GLOBALS['flag']) {
               echo 'flag works';
             //do something
           }
        }

        //end require_once ($include_file);

        test();
    }
}

something();

echo $flag; //echos 4

exit;

Büyük olasılıkla size sorun veriyor hattı bu biridir: echo 'global scope flag'=$flag;

Bunu değiştirin: echo 'global scope flag = '.$flag;

Edit: Now that you have edited you code snippet to by wrapping your code in the something() function, the problem becomes more clear. I think what is happening here is that the when you initialize $flag with $flag = 4;, it's scope is within the something() method.

Satırından önce $flag = 4; / 'Yukarıda yerleştirmeyi deneyin function something() {. Sonra tüm dünya ile doğru olacaktır.

echo 'global scope flag'=$flag; olmamalıdır echo 'global scope flag =' . $flag;

Ben farklı bir hata aldım. Hangi bana çabuk sorunu düzeltmek yardımcı oldu.

Parse error: parse error, unexpected '=', expecting ',' or ';' in D:\Websites (Apache)\Test Site1\test.php on line 6

Sadece böyle bir şey yapın:

$myFlag = getFlag(); 
echo $myFlag; // output: whatever


// test.php 

$flag = 'whatever'; 

function getFlag(){
    global $flag;   
    return $flag; 
}

Ben bir komut bir değişken ve başka bir dosya onu asla aramam. Bu yolda aşırı karışıklığa neden olacaktır. Hatta benim çözüm iyi değil. Ben ideal w / tam şişmiş bir sınıf olarak bu yapardı.

Since your original question has already been answered let me suggest another approach that avoids global variables all together.
You seemingly have a function + a default value that you set as a global variable. You can also define default values for function parameters.

<?php // test.php
function test($flags=4) {
  echo '<br/>in test flag="'.$flags.'"';
  if ($flags!=0) {
    echo ' flag works';
  }
}

Hayır global değişken, ama yine de bir parametre olmadan test () çağırabilir ve işlevi varsayılan değeri kullanın - Eğer parametre geçirerek üzerine yazabilirsiniz.

function something() {
  $include_file = 'test.php';
  if ( file_exists($include_file) ) {
    require_once ($include_file);
    echo "\nwithout parameter: "; test();
    echo "\nwith a parameter: "; test(16);
  }
}
something();
exit;

baskılar

without parameter: <br/>in test flag="4" flag works
with a parameter: <br/>in test flag="16" flag works

İşte exactly aynı davranış değil ama may be Eğer ilk etapta ne istediğini ....

edit: Başka bir nokta olabilir

if ( file_exists($include_file) ) {
  require_once ($include_file);

Kullandığınız inşa. Ben bu konuda güçlü bir görüş (ya da herhangi bir güçlü kanıtlar ;-)) yok ama kullandığınız düşünebilirsiniz

$something = include $include_file;
if ( false!==$something ) { /* error handling here... */ }

yerine. include "döner" php dosyası yoktur eğer yanlış. Tüm bu çalışmaları bunun için 'gerekli dahil dosyası açıkça FALSE dönmez olmasıdır. (APC gibi bir şey kullanırken örneğin) bu might dostça önbellek olacak. Fakat yine de: ben eldeki Bunun için hiçbir kanıt, sadece bir önsezi var. En azından bu kodu "nazikçe" bir hata işlemek için bir şans verir.