2013-03-28 21 views
43

Çoğu programlama dilleri kapsam kurallarına göre, içlerindeki işlevlerin dışında tanımlanmış değişkenlere erişebilirim, ancak bu kod neden çalışmaz?PHP erişim global değişkeni işlevde

<?php 
$data='My data'; 
function menugen(){ 

    echo "[".$data."]"; 
} 
menugen(); 
?> 

çıkış [] bulunmaktadır.

+3

, küresel olarak muamele manuel böyle şeyler diyor bir argüman –

+1

olarak işleve geçmek musunuz? – deceze

+0

İlgili okumalar: [PHP global işlevler] (http://stackoverflow.com/q/5166087/1409082) – Jocelyn

cevap

83

size erişen olacak olan genel değişkenleri bildirmek için sahip çünkü çalışmıyor:

$data='My data'; 
function menugen(){ 
    global $data; // <-- add this line 
    echo "[".$data."]"; 
} 
menugen(); 

aksini $GLOBALS['data'] olarak erişebilir, bkz. http://php.net/manual/en/language.variables.scope.php

Biraz OT bile olsa kullanmamanızı öneririm globals hiç ve parametre olarak geçmeyi tercih eder.

+0

sayesinde Haklısınız ama kılavuzun ikinci örnekte bu çizgiyi kullanmıyordu: http: –

+3

//php.net/manual/en/language.variables.scope.php Aslında ikinci örnek göstermek olduğunu okuyucular neyi ** değil ** yapmalı: 'echo ifadesi $ a değişkeninin yerel sürümüne atıf çünkü bu komut herhangi bir çıktı üretmek olmaz ve bu scope.' –

+1

Dang içinde bir değer tahsis edilmemiştir! Bu cevabı almak için giriş yapmam gerekti çünkü sadece php değişkenlerini kapsamayı unuttum. –

0

İşlevin içine değişken geçirmek gerekir:

$data = 'My data'; 

function menugen($data) 
{ 
    echo $data; 
} 
6

Bu bir kapsam konusudur. Kısacası, Küresel değişkenler SO kaçınılmalıdır: Bakınız: o

class MyClass 
{ 
    private $data = ""; 

    function menugen() 
    { 
     echo this->data; 
    } 

} 

düzenleme bir sınıf ve erişim

$data = 'My data'; 

function menugen($data) 
{ 
    echo $data; 
} 

VEYA buna sahip:

You ya bir parametre olarak geçmek gerekir @MatteoTassinari, ona erişmek için global olarak işaretleyebileceğiniz gibi yanıtlar ancak genel değişkenler genellikle gerekli değildir, dolayısıyla kodunuzu yeniden düşünmek akıllıca olacaktır.

+0

ve başka bir şekilde ** global ** anahtar sözcüğünü kullanmak (verilen, bu en iyi yol değildir). – Jocelyn

+0

Evet, sadece Matteo'nun gönderisine bir not eklemek için düzenlenmiştir. – webnoob

+0

"Should" soruyu yanıtlamıyor ve bu her durum için en iyi yaklaşım olmayabilir. Basit komut dosyaları için, etraftaki parametreleri değiştirmek ve sınıfları eklemek zahmetli. PHP'deki JavaScript gibi, her şeyin nesne yönelimli olması ve wazoo'yu isimlendirmesi gerekmiyor. – Beejor

7

aşağıdakilerden birini yapabilirsiniz:

<?php 
$data='My data'; 
function menugen(){ 
    global $data; 
    echo "[".$data."]"; 
} 
menugen(); 

Ya

söyleniyor
<?php 
$data='My data'; 
function menugen(){ 
    echo "[".$GLOBALS['data']."]"; 
} 
menugen(); 

, globalsin aşırı bazı kötü koda sebep olabilir. İhtiyacınız olan şeyleri geçmek genellikle daha iyidir. Örneğin, global bir veritabanı nesnesine başvurmak yerine, veritabanına bir tanıtıcı geçirmeniz ve bunun üzerine hareket etmeniz gerekir. Buna Bağımlılık Enjeksiyonu denir. Otomatik test uyguladığınızda (ki bunu yapmanız gerekir) hayatınızı kolaylaştırır.

3

bir başka yolu bunu yapmak için: Eğer bir kez değiştirilir tanımlanamaz bir sabitler oluşturmak kullanmak işlevi ancak bu işlevi "define" olabilir istiyorsanız

<?php 

$data = 'My data'; 

$menugen = function() use ($data) { 

    echo "[".$data."]"; 
}; 

$menugen(); 
-1

.

<?php 
define("GREETING", "Welcome to W3Schools.com!"); 

function myTest() { 
    echo GREETING; 
} 

myTest(); 
?> 

http://www.w3schools.com/php/php_constants.asp

+0

Bu, bir değişkeni değil, genel bir sabit tanımlar. – Beejor

+0

Farklı olan nedir? İçindekileri herhangi bir yerde saklayabilirsiniz –

+2

Sabitler tanımlandıktan sonra değiştirilemez. – Beejor