SORU
2 Mart 2011, ÇARŞAMBA


PHP fonksiyonları küresel

global keyword programı nedir?

Başka bir yöntem tercih etmek için herhangi bir sebep var mı?

  • Güvenlik?
  • Performans?
  • Başka bir şey?

Yöntem 1:

function exempleConcat($str1, $str2)
{
  return $str1.$str2;
}

Yöntem 2:

function exempleConcat()
{
  global $str1, $str2;
  return $str1.$str2;
}

Zaman duygusu global kullanmak için yapar mı?

Benim için, 26 *...* ama sadece bir bilgi eksikliği olabilir. İlgileniyorumbelgelenmiş(kod örneği ile, belgeler için bağlantı...) örneğin, teknik nedenlerden dolayı.

Şimdiden teşekkürler!


Ödül

Bu konu hakkında güzel genel bir soru, Ben (@Gordon) ek cevap almak için bir ödül teklif. İster cevap benimki ile uyum içindedir ya da farklı bir bakış açısı önemli değil verir. global konu her şimdi ve sonra geliyor bu yana kullanabiliriz iyi bir "canonical" bağlantı cevap vermek.

CEVAP
2 Mart 2011, ÇARŞAMBA


Global kötüdür

Bu global anahtar kelime olarak global etki (statik, tekiz, kayıt defterleri, sabitler), yerel bir kapsam ulaşan diğer her şey için de geçerlidir. Onları kullanmak istemiyorum. Bir işlev çağrısı, örneğin dışında bir şeye güvenmek zorunda değil

function fn()
{
    global $foo;              // never ever use that
    $a = SOME_CONSTANT        // do not use that
    $b = Foo::SOME_CONSTANT;  // do not use that unless self::
    $c = $GLOBALS['foo'];     // incl. any other superglobal ($_GET, …)
    $d = Foo::bar();          // any static call, incl. Singletons and Registries
}

Bu kod dışarıya bağımlı hale getirecek. Demek ki, güvenilir bir şekilde bunlardan herhangi birini aramadan önce uygulamanızda tam küresel durumu bilmek zorunda. İşlevini ortam olmadan var.

Bu superglobals kullanarak bariz bir kusur olmayabilir, ama eğer bir Komut satırından kod ararsan $_GET $_POST yok. Eğer kodunuzu bu gelen verilere dayanır, web ortamı için kendini kısıtlıyorsun. Sadece bir nesneye istek soyut ve yerine bunu kullanın.

Kaplin kodlanmış classnames (statik, sabitler), fonksiyon da olamaz sınıf mevcut olmadan var. Aynı ad sınıfları ne zaman bir sorun daha az, ama farklı bir ad karışımı başlattığınızda, karışık bir karmaşa yarattın.

Yeniden ağır şekilde tüm yukarıdaki engel oluyor. So is unit-testing.

Ayrıca, işlev imzaları genel kapsamına birkaç zaman yalan söylüyor

function fn()

bir şey geçmeden bu fonksiyonu çağırabilirim iddia çünkü bir yalancı. Belli bir devlet haline ortamı ayarlamak zorunda olduğumu öğrenmek işlev gövdesi bakıyorum sadece.

Eğer işlev bağımsız çalışmasını gerektiriyorsa, onları açık olun ve onları geçmek

function fn($arg1, $arg2)
{
    // do sth with $arguments
}

açıkça adı ne gerektirir imzasını taşır. Çevreye bağlı olmayan özel bir durumda. Dont yapmak zorunda

$arg1 = 'foo';
$arg2 = 'bar';
fn();

(Bağımsız) (genel anahtar) vs itme çekme meselesi. Kronik bağımlılıklar/itme işlevi dışında artık kullanılmıyor. fn(1) ne zaman sen dont dışında bir yer tutan bir değişken 1. Ancak işlev içinde $one global çekerken, genel kapsama çift ve bir yerde tanımlı bir değişken olmasını bekliyoruz. Bu işlev, artık bağımsız.

Daha da kötüsü, fonksiyon içinde global değiştirirken, kodunuzu hızlı bir şekilde fonksiyonları her yerde yan sahip olduğundan tamamen anlaşılmaz olacaktır.

Daha iyi bir örnek olmaması, düşünün

function fn()
{
    global $foo;
    echo $foo;     // side effect: echo'ing
    $foo = 'bar';  // side effect: changing
}

Ve bunu yapmak için

$foo = 'foo';
fn(); // prints foo
fn(); // prints bar <-- WTF!!

$foo bu üç hatları değişmiş olduğunu görmek için bir yolu yoktur. Neden aynı argümanlar ile aynı işlevi ani bir değişiklik aradığını çıkış veya genel durumunda bir değeri değiştirmek istiyorsunuz? Bir fonksiyon tanımlanmış bir giriş Y. her Zaman için X ne olmalıdır.

Bu OOP saklama çünkü OOP kullanırken bile daha şiddetli olur, ve global kapsam ulaşarak, sarma kesiliyor. Çerçeveler gördüğünüz bütün bunlar Tek ve Kayıtları Bağımlılık Enjeksiyon lehine kaldırılmalıdır kodu kokuyor. Kodunuzu ayrıştır.

Daha Fazla Kaynak:

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 8bitdigitaltv

    8bitdigitalt

    31 AĞUSTOS 2011
  • BDGcustoms

    BDGcustoms

    24 NİSAN 2011
  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007