PHP: Fonksiyonlar no idea değişkenler mevcut bile var

3 Cevap php

Ben (5.2.11 çalıştıran) PHP rahatsız edici bir özelliğe fark ettik. Bir sayfa başka bir sayfaya (ve hem kendi değişkenleri ve işlevlerini içerir) içeriyorsa, her iki sayfa birbirlerinin değişkenleri farkındayız. Ancak, işlevleri (işlev içinde bildirilen olanlar hariç) hiç değişkenlerin farkında gibi görünüyor.

My question: Neden böyle oluyor? Nasıl ben not olur, ya da bu konuda gitmek için daha iyi bir yolu nedir yapabilirim?

Ben tarif ediyorum ne bir örneği aşağıdadır.

Ana sayfa:

<?php
$myvar = "myvar.";
include('page2.php');

echo "Main script says: $somevar and $myvar\n";
doStuff();
doMoreStuff();
function doStuff() {
    echo "Main function says: $somevar and $myvar\n";
}
echo "The end.";
?>

sayfa2.php:

<?php
$somevar = "Success!";

echo "Included script says: $somevar and $myvar\n";

function doMoreStuff() {
    echo "Included function says: $somevar and $myvar\n";
}
?>

Çıktı:

Included script says: Success! and myvar.
Main script says: Success! and myvar.
Main function says: and
Included function says: and
The end.

Both pages output the variables just fine. Their functions do not.
WRYYYYYY

3 Cevap

Bir fonksiyon kapsamı dışında tanımlanmış değişkenleri kullanmadan önce global kullanmanız gerekir:


function doStuff() {
    global $somevar, $myvar;
    echo "Main function says: $somevar and $myvar\n";
}

Daha detaylı bir açıklama verilmektedir: http://us.php.net/manual/en/language.variables.scope.php

Yorumlarınız ve As Diğer cevaplar doğru çekti, globallerinin can be evil. Açıklayan bu makaleye göz atın sadece neden: http://my.opera.com/zomg/blog/2007/08/30/globals-are-evil

Eğer küresel değişkenler kullanıyor olsa da, bu çağrı üzerine fonksiyonlara parametre olarak değişkenleri geçmek için genellikle iyi bir uygulamadır. Bu fonksiyon uygun yürütülmesi için bekliyor tam olarak ne değişkenler biliyorum sağlar. Bu is not a bug, sadece intended functionality.

$someVar = 'hey';
$myVar = 'you';

doStuff($someVar, $myVar);
doMoreStuff($someVar, $myVar);


function doStuff($somevar, $myvar) {
    echo "Main function says: $somevar and $myvar\n";
}

function doMoreStuff($somevar, $myvar) {
    echo "More function says: $somevar and $myvar\n";
}

Ayrıca fonksiyon kapsamı dışında değişkenleri fonksiyon kendilerini parametre olarak eşleşen adları olması gerekmez fark. Bu gibi şeyler yapmanızı sağlar:

$badVar = 'look at me, im a bad var.';
goodFunction($badVar);

function goodFunction ($goodVar) {
    // output: look at me, im a good var
    echo str_replace('bad', 'good', $goodVar);
}

php hiçbir kapsam hiyerarşi, yani, fonksiyonlar 'birbirlerinin farkında değildir (veya global) değişkenler vardır. Bu, daha önce başka dillerde ile çalıştı eğer biraz garip, ama globallerinin "kötü", çünkü, aslında iyi bir şey. En iyi yaklaşım, onları tamamen kaçınmaktır.