php global değişken değiştirici çalışmıyor

8 Cevap php

Ben küresel değiştirici için temel php örneği kullanıyorum, ve bu benim için çalışmıyor :-|

$a = 1;
$b = 2;

function Sum()
{
    global $a, $b;

    $b = $a + $b;
} 

Sum();
echo "***: ".$b;

Here is the result... $ ***: 2

Bu etkileyebilecek php.ini üzerinde herhangi bir parametre var mı?

8 Cevap

Believe it or not, I get answer: 2 as well. This means there are indeed some cases where global is not working.

Tried finding the cause: It seems that if you have a function and put the OP's code (which is a php.net example) inside that function, you will get answer 2. This is a bit weird and kinda makes sense in a way...

(Ben Win XP Apache 2.2.8 altında PHP 5.2.5 kullanıyorum)

LE: MY SOLUTION OK, solved this: when you use global in the 2nd function you obviously get the superglobal variables, those available to everybody (ie. decalared outside any function), but since $a and $b are declared inside the 1st function, they are not part of that scope and are not available to the 2nd function. My guess for a solution is to declare $a and $b global, outside the 2nd function as well, that is inside the 1st function. !! Note that the 1st may be not so obvious due to various reasons, like your file (only containing the 2nd function) being included somewhere in the body of a different function in a different file.

Bu benim için çalışıyor, ben herhangi bir php.ini parametre tweaked asla.

Benim için de gayet iyi çalışıyor. Bu kod tam bir kopyası mı?

Yukarıdaki örnek kod benim için çalışıyor. Ama aynı zamanda $GLOBALS supervariable kullanabilirsiniz.

function Sum()
{
    $a = $GLOBALS["a"];
    $b =& $GLOBALS["b"];
    $b = $a + $b;
}

Eğer olsa bunu yardımcı olabilir eğer küresel değişkenler kullanılmamalıdır. Fonksiyonlarınızı yapmak için daha iyi yollar vardır. parameters (arguments) (belki pass by reference) ve return a value yerine kullanın.

/**
 * Calculate the sum of the parameters
 * @param int|float $a one or more parameter
 * @param int|float $a, ... 
 * @return int|float
 */
function sum($a)
{
    $args = func_get_args();
    return array_sum($args);
}

$a = 1;
$b = 2;

$b = sum($a, $b);

PHPDOC sizin fonksiyonları kodunu okumadan artık yıl ne anlayabiliyorum ile. Eğer fonksiyon yazmak gibi bir yararı ile IDE ayrıca açıklama ve argüman sipariş alabilirsiniz.

Önce bir işlev çağrıldıktan sonra global kapsamda değişkenleri atama eğer ben yanlış gittiğini düşünebiliriz tek şeydir. Bu sizin işlevi aslında değişkenleri bildirmek ve daha sonra sadece başka bir yerde bunların üzerine, olduğunu. Örneğin, Sum() çağrı ve then yaptığını $a=1, $b=2.

ben senin gibi SAME PROBLEM, ve nihayet cevap buldu

working code / DEMO

$a=1;

function showA() {

    global $a;
    var_export($a);  

} 

showA(); // outputs "1"

non working code / DEMO

function encapsulation() {

    $a=1;

    function showA() {

        global $a;
        var_export($a);  

    };

    showA();

}  

encapsulation(); // outputs "NULL"

Gördüğünüz gibi iç içe geçmiş bir işlev tanımı içindeki global keyword kullanırken sorun oluşur

Daha Fazla Bilgi: php.net/manual/en/language.variables.scope.php#92868

global anahtar kelime size farklı bir kapsam içinde değişkenlerin read değerine yeteneği verir, ama bu değişkenlerin modify değerlere izin vermiyor .

Ben de senin sorunu ile karşı karşıya geldi. Ben bir çerçeve (Yii) kullanıyorum gibi, benim kod gerçekten işlevlerde iç içe olduğunu tam olarak farkında değildi ve, beklendiği gibi (omadmedia ve diğerleri tarafından açıklandığı gibi), bu nedenle, global davranmak değildi.

Benim çözüm oldukça basittir:

global $a;
global $b;
$a = 1;
$b = 2;

function Sum()
{
    global $a, $b;

    $b = $a + $b;
} 

Sum();
echo "***: ".$b;