2013-03-28 11 views
43

In base alla maggior parte delle regole di ambito dei linguaggi di programmazione, posso accedere a variabili definite al di fuori delle funzioni al loro interno, ma perché questo codice non funziona?Variabile globale di accesso PHP in funzione

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

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

C'è [] in uscita.

+3

non trattata come globale, passare alla funzione come argomento –

+1

Da dove viene il manuale di dire queste cose? – deceze

+0

Lettura correlata: [PHP globale nelle funzioni] (http://stackoverflow.com/q/5166087/1409082) – Jocelyn

risposta

83

Non funziona perché si deve dichiarare quali variabili globali sarete accedendo:

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

altrimenti si può accedervi come $GLOBALS['data'], vedere http://php.net/manual/en/language.variables.scope.php

Anche se un po 'di OT, ti suggerirei di evitare di usare globalmente e preferiscono passare come parametri.

+0

Grazie, hai ragione ma non hanno usato questa riga nel secondo esempio di manuale: http: //php.net/manual/en/language.variables.scope.php –

+3

In realtà quel secondo esempio era lì per mostrare i lettori cosa ** not ** fare: 'Questo script non produrrà alcun output perché l'istruzione echo si riferisce a una versione locale della variabile $ a, e non gli è stato assegnato un valore all'interno di questo ambito. –

+1

Dang! Ho dovuto effettuare il login per sovvertire questa risposta solo perché ho dimenticato le oscillazioni delle variabili php. –

0

è necessario passare la variabile in funzione:

$data = 'My data'; 

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

È una questione di ambito. In breve, le variabili globali dovrebbero essere evitati SO:

Si sia bisogno di passare come parametro:

$data = 'My data'; 

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

o fa in una classe e accedervi

class MyClass 
{ 
    private $data = ""; 

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

} 

Edit: Vedi @MatteoTassinari rispondi e puoi contrassegnarlo come globale per accedervi ma i vars globali non sono generalmente richiesti, quindi sarebbe saggio ripensare la tua codifica.

+0

e un altro modo è utilizzare la parola chiave ** globale ** (concesso, questo non è il modo migliore). – Jocelyn

+0

Sì, appena modificato per aggiungere una citazione al post di Matteo. – webnoob

+0

"Should" non risponde alla domanda e questo potrebbe non essere l'approccio migliore per ogni caso. Per gli script semplici, la modifica dei parametri e l'aggiunta di classi sono goffi. Proprio come JavaScript, in PHP non tutto ha bisogno di essere orientato agli oggetti e creato il namespace della wazoo. – Beejor

7

È possibile effettuare una delle operazioni seguenti:

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

O

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

Detto questo, un uso eccessivo di variabili globali può portare a qualche codice poveri. Di solito è meglio passare in quello che ti serve. Ad esempio, invece di fare riferimento a un oggetto di database globale, devi passare un handle al database e agire di conseguenza. Questo è chiamato Iniezione di dipendenza. Ti rende la vita molto più semplice quando implementi test automatici (che dovresti).

3

Un altro modo per farlo:

<?php 

$data = 'My data'; 

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

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

$menugen(); 
-1

Se si vuole si può usare "definire" la funzione, ma questa funzione creare un costanti che non possono essere modificati una volta definite.

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

function myTest() { 
    echo GREETING; 
} 

myTest(); 
?> 

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

+0

Definisce una costante globale, non una variabile. – Beejor

+0

Qual è il diverso? È possibile memorizzare qualsiasi cosa in esso –

+2

Le costanti non possono essere modificate una volta definite. – Beejor