SORU
6 HAZİRAN 2013, PERŞEMBE


Referans: değişkenler yerden erişilebilir değişken kapsamı, Ne olduğunu ve ne "tanımsız değişken" hatalar?

Not: Bu PHP değişken kapsamı ile ilgili referans bir soru. Bu bir kopyası olarak çok soru uydurma bu desen kapatın lütfen.

"PHP? kapsam "değişken nedir Değişken biri .dosya erişilebilir başka bir php? Neden bazen alabilirim< . em ^"tanımsız değişken"hatalar?

CEVAP
6 HAZİRAN 2013, PERŞEMBE


"Değişken kapsam"?

Değişkenler sınırlı "" veya "erişilebilir yerler". kapsam $foo = 'bar'; yazmıştın diyebir yereuygulamanız 14 ** başvurabilirsiniz anlamına gelmiyorher yerdeuygulama içinde başka. $foo aynı kapsamda, içinde geçerli ve sadece kod belli bir kapsamı vardır değişken değişken erişimi vardır.

Nasıl bir kapsam PHP tanımlanır?

Çok basit: PHPkapsam fonksiyonu. PHP bulunduğunu kapsam ayırıcı tek tür. Bir fonksiyon içindeki değişkenler sadece o fonksiyon içinde kullanılabilir. İşlevlerin dışında değişkenler kullanılabilir herhangi bir yerde herhangi bir işlev içinde işlevleri dışında, ama değil. PHP bir özel alan vardır bu anlamına gelirglobalkapsam. Herhangi bir değişken herhangi bir işlevin dışında bildirilmiş bu genel kapsam içinde.

Örnek:

<?php

$foo = 'bar';

function myFunc() {
    $baz = 42;
}

$fooglobalkapsam $bazyerelmyFunc kapsam içinde. myFunc içinde sadece kod $baz erişimi vardır. Sadece koddışarıdamyFunc 23 ** erişimi vardır. İkisi de birbirine erişimi vardır:

<?php

$foo = 'bar';

function myFunc() {
    $baz = 42;

    echo $foo;  // doesn't work
    echo $baz;  // works
}

echo $foo;  // works
echo $baz;  // doesn't work

Kapsam ve eklenen dosyalar

Sınırları dosyaayrı değilkapsam:

a.php

<?php

$foo = 'bar';

b.php

<?php

include 'a.php';

echo $foo;  // works!

Başka bir kod için geçerlidir included kodu için geçerli aynı kurallar: functions ancak ayrı bir kapsam. Kapsam açısından, kopyalama gibi dosyaları da dahil olmak üzere Kodu ve yapıştırma düşünebilirsiniz:

c.php

<?php

function myFunc() {
    include 'a.php';

    echo $foo;  // works
}

myFunc();

echo $foo;  // doesn't work!

Yukarıdaki örnek, a.php myFunc, a.php sadece işlevin kapsamı içinde herhangi bir değişken içine dahil oldu. Onlar sadece çünkügörünüra.php küresel kapsamda olmak için mutlaka anlamına gelmez, aslında bu kod dahil bağlıdır çalıştırılmış.

Ne fonksiyonlar ve sınıflar içindeki fonksiyonlar hakkında?

function her yeni bildirim yeni bir kapsam sunuyor, bu kadar basit.

fonksiyonlar içinde (anonim) işlevleri

function foo() {
    $foo = 'bar';

    $bar = function () {
        // no access to $foo
        $baz = 'baz';
    };

    // no access to $baz
}

sınıflar

$foo = 'foo';

class Bar {

    public function baz() {
        // no access to $foo
        $baz = 'baz';
    }

}

// no access to $baz

Kapsamı ne iyi gelir?

Kapsam sorunları ile ilgili rahatsız edici, ama görünebilirsınırlı değişken kapsamı karmaşık uygulamalar yazmak için gereklidir.Eğer bildirdiğiniz her değişken uygulama içinde her yerde kullanılabilir olacaktır, ne gibi değişiklikler ne izlemek için gerçek bir yolu ile değişkenler ezmeye olursun. Sadece değişkenler için size çok mantıklı isim var, muhtemelen kullanmak istediğiniz değişkeni "$name" birden fazla yer. Eğer sadece bu benzersiz değişken adı bir kez uygulamanızı, sen başvurmak için gerçekten karmaşık adlandırma düzenleri için emin olun değişkenleri benzersiz ve o sen değilsin değişen yanlış değişken yanlış parça kodu.

İnceleyin:

function foo() {
    echo $bar;
}

Eğer kapsamı ise, hayır, yukarıdaki fonksiyonu ne yapardın? Nerede $bar nereden geliyor? Ne devlet var mı? Hatta başlatıldı. Her zaman kontrol etmek zorunda mısın? Bu sürdürülebilir değil. Bizi götürüyor.

Kapsam sınırları aşıyorsun

Doğru: içeride ve dışarıda . değişken geçirmeden

function foo($bar) {
    echo $bar;
    return 42;
}

41 ** değişken açıkça işlev bağımsız değişken olarak bu kapsam içine geliyor. Sadece bu işlev bakarak köken ile çalıştığı belli. O zaman açıkçaverirbir değer. Arayan işlevi ile çalışır ve dönüş değerleri nereden geldiğini öğrenmek güveni vardır:

$baz   = 'baz';
$blarg = foo($baz);

Anonim işlevler değişkenleri kapsamını genişletmek

$foo = 'bar';

$baz = function () use ($foo) {
    echo $foo;
};

$baz();

Anonim işlevi açıkça çevresindeki kapsam $foo içerir. Bu aynı olmadığını unutmayınglobalkapsam.

Yanlış yol: global

Daha önce söylediğim gibi, küresel kapsamı biraz özel ve fonksiyonları açıkça bu değişkenler alabilirsiniz:

$foo = 'bar';

function baz() {
    global $foo;
    echo $foo;
    $foo = 'baz';
}

Bu işlev ve 47 ** global değişkenini kullanır değiştirir.Bu! yapmayınSen really really really ne yaptığını, ve o zaman bile: really bilmeden (!)

Bu işlev, arayanın görüyor hepsi bu

baz(); // outputs "bar"
unset($foo);
baz(); // no output, WTF?!
baz(); // outputs "baz", WTF?!?!!

Bu işlev, herhangi bir gösterge yokyan etkilerihenüz yok. Bu çok kolay bazı fonksiyonları değiştirme tutmak gibi karışık bir karmaşa haline gelirve gerektirenbazı genel durum. Fonksiyonlar olmak istiyorumvatansızonların girişler sadece üzerine etki eden ve onları aramak ancak tanımlı çıktı, dönüyor.

Küresel kapsamı kullanarak herhangi bir şekilde mümkün olduğunca kaçınmalısınız; kesinlikle "" yerel bir kapsam içine küresel kapsamı dışında. değişkenleri çekerek olmamalı

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bcbauer

    bcbauer

    7 ŞUBAT 2007
  • Deany Boii

    Deany Boii

    27 Kasım 2007
  • SDSARG3

    SDSARG3

    14 Mart 2009