2013-03-28 18 views
43

Zgodnie z większością zasad dotyczących języków programowania, mogę uzyskać dostęp do zmiennych, które zostały zdefiniowane poza funkcjami w nich zawartymi, ale dlaczego ten kod nie działa?Globalna zmienna dostępu PHP w funkcji

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

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

Jest [] produkcji.

+3

Nie traktuj go jako globalny, przekazać go do funkcji jako argumentu –

+1

Skąd instrukcja mówić takie rzeczy? – deceze

+0

Powiązane uwagi: [Globalne funkcje PHP] (http://stackoverflow.com/q/5166087/1409082) – Jocelyn

Odpowiedz

83

To nie działa, ponieważ masz zadeklarować zmienne globalne, które będziesz dostępu:

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

inaczej można uzyskać do niego dostęp jako $GLOBALS['data'], zobacz http://php.net/manual/en/language.variables.scope.php

Nawet jeśli trochę OT, sugeruję, aby unikać używania globale i wolą przekazywać jako parametry.

+0

Dzięki, masz rację, ale nie użyli tej linii w drugim przykładzie instrukcji: http: //php.net/manual/en/language.variables.scope.php –

+3

W rzeczywistości ten drugi przykład był tam do pokazania czytelnicy co ** nie ** zrobić: 'Ten skrypt nie wygeneruje żadnego wyjścia, ponieważ instrukcja echo odnosi się do lokalnej wersji zmiennej $ a, i nie została mu przypisana wartość w tym zakresie." –

+1

Dang! Musiałem się zalogować, aby upowszechnić tę odpowiedź tylko dlatego, że strasznie zapomniałem zmierzyć zmienne php. –

0

Trzeba przekazać zmienną do funkcji:

$data = 'My data'; 

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

To kwestia zakresu. W skrócie, zmienne globalne należy unikać SO:

albo trzeba przekazać go jako parametr:

$data = 'My data'; 

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

LUB mieć ją w klasie i do niego dostęp

class MyClass 
{ 
    private $data = ""; 

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

} 

Edycja: Zobacz Odpowiedź @MatteoTassinari, jak również możesz oznaczyć go jako globalny, aby uzyskać do niego dostęp, ale globalne warianty nie są na ogół wymagane, więc dobrze byłoby ponownie przemyśleć swoje kodowanie.

+0

i innym sposobem jest użycie słowa kluczowego ** global ** (przyznane, to nie jest najlepszy sposób). – Jocelyn

+0

Tak, właśnie edytowane, aby dodać wzmiankę do postu Matteo. – webnoob

+0

"Powinno" nie odpowiada na pytanie, a to może nie być najlepsze podejście do każdego przypadku. W przypadku prostych skryptów zmiana parametrów i dodawanie klas jest nieporęczna. Podobnie jak JavaScript, w PHP nie wszystko musi być zorientowane obiektowo, a na liście wazoo. – Beejor

7

Można wykonać jedną z następujących czynności:

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

Albo

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

Mając na uwadze powyższe, nadużywanie globalnych może prowadzić do słabej kodu. Zazwyczaj lepiej jest przekazać to, czego potrzebujesz. Na przykład zamiast wskazywać globalny obiekt bazy danych, należy przekazać uchwyt do bazy danych i postępować zgodnie z nim. Nazywa się to Dependency Injection. Znacznie ułatwia to twoje życie, gdy zaimplementujesz zautomatyzowane testy (które powinieneś).

3

Innym sposobem, aby to zrobić:

<?php 

$data = 'My data'; 

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

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

$menugen(); 
-1

Jeśli chcesz, możesz użyć „zdefiniować” funkcji, ale tę funkcję stworzenia stałych, które nie mogą być zmieniane raz zdefiniowane.

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

function myTest() { 
    echo GREETING; 
} 

myTest(); 
?> 

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

+0

To definiuje stałą globalną, a nie zmienną. – Beejor

+0

Co jest innego? Możesz przechowywać w nim dowolne wartości –

+2

Po zdefiniowaniu stałych nie można zmienić. – Beejor