¿Cómo declarar una variable global en php?

168

Tengo un código como este:

<?
    $a="localhost";
    function body(){
        global $a;
        echo $a;
    }

    function head(){
        global $a;
        echo $a;
    }

    function footer(){
        global $a;
        echo $a;
    }
?>

¿Hay alguna manera de definir la variable global en un lugar y hacer que la variable sea $aaccesible en todas las funciones a la vez? sin hacer uso de global $a;más?

LIGERO
fuente
15
No, no lo hay. Si no le gusta la globalpalabra clave, considere usar el $GLOBALS['a']superglobal en todos los ámbitos, o considere pasar el parámetro a sus funciones.
Michael Berkowski el
55
Si es algo importante, incluso se puede usar una sesión var.
Nikos Tsirakis

Respuestas:

259

La $GLOBALSmatriz se puede usar en su lugar:

$GLOBALS['a'] = 'localhost';

function body(){

    echo $GLOBALS['a'];
}

Del manual :

Una matriz asociativa que contiene referencias a todas las variables que están definidas actualmente en el ámbito global del script. Los nombres de las variables son las claves de la matriz.


Si tiene un conjunto de funciones que necesitan algunas variables comunes, una clase con propiedades puede ser una buena opción en lugar de una global:

class MyTest
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function head()
    {
        echo $this->a;
    }

    public function footer()
    {
        echo $this->a;
    }
}

$a = 'localhost';
$obj = new MyTest($a);
MrCode
fuente
78

Si la variable no va a cambiar, puede usar define

Ejemplo:

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!');

function footer()
{
    echo FOOTER_CONTENT;
}
Valle
fuente
2
¿Qué sucede cuando FOOTER_CONTENTse intenta modificar? ¿Es como finalen Java o consten C, C ++ y C #?
León
44
Si intentas definir FOOTER_CONTENT por segunda vez, php enviará un aviso al respecto
Dale el
Necesitaba calcular el tiempo de época actual de Unix cada vez que se carga una página, luego usar ese valor en un par de cálculos (funciones). "definir" funcionó para mí. Inicialmente, no vi ese "echo FOOTER_CONTENT;" no tenía un '$' anterior y obtuve errores.
user208145
Si la variable no va a cambiar, no es una variable. ¿No es así?
Sajidur Rahman
29

Agregue sus variables en $ GLOBALS super global array como

$GLOBALS['variable'] = 'localhost'; 

y usarlo globalmente

o puede usar constantes que son accesibles en todo el script

define('HOSTNAME', 'localhost');  
Pankaj Khairnar
fuente
1
Si usa 'definir', una vez establecido, ¡no puede cambiar una definición!
Reza MA
en su primer ejemplo, ¿está diciendo que la 'variable $ ahora se llama' localhost 'más adelante en el script?
Zach Smith
no, si desea usar esta variable, debe usarla como $ GLOBALS ['variable'];
Pankaj Khairnar
25

Si una variable se declara fuera de una función, ya está en el ámbito global. Entonces no hay necesidad de declarar. Pero desde donde llama a esta variable debe tener acceso a esta variable. Si llama desde una función, debe usar la globalpalabra clave:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

Usar una palabra clave global fuera de una función no es un error. Si desea incluir este archivo dentro de una función, puede declarar la variable como global.

config.php

global $variable;

$variable = 5;

other.php

function name()
{
    require_once __DIR__ . '/config.php';
}

Puedes usar $GLOBALStambién. Es un superglobal, por lo que tiene acceso a todas partes.

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}

Dependiendo de su elección, puede elegir cualquiera.

Sajidur Rahman
fuente
9

Esta respuesta es muy tardía, pero lo que hago es establecer una clase que contenga valores booleanos, matrices y valores enteros iniciales como variables estáticas de alcance global. Cualquier cadena constante se define como tal.

define("myconstant", "value"); 

class globalVars {

    static $a = false;

    static $b = 0;

    static $c = array('first' => 2, 'second' => 5);

}


function test($num) {

    if (!globalVars::$a) {

        $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.';

        globalVars::$a = true;

    } else {

        $returnVal = 'I forgot';

    }

    return $returnVal;

}

echo test(9); ---> The value of 9 + 0 + 5 is 14.

echo "<br>";

echo globalVars::$a; ----> 1

Las staticpalabras clave deben estar presentes en la clase; de ​​lo contrario, los valores $ a, $ b y $ c no tendrán alcance global.

The One and Only ChemistryBlob
fuente
Esta es una buena solución por muchas razones. La clase estática requiere solo unos pocos caracteres agregados al nombre de la variable básica: G :: $ Name, donde la declaración se ve así: clase G {static $ Name, $ Name2;} Tenga en cuenta que G puede ser variables realmente globales, entonces E podría ser utilizado para variables relacionadas con los empleados. Esto es más fácil de programar que el paradigma orientado a objetos a gran escala compatible con PHP. Si las constantes son realmente necesarias, puede declararlas después de "const" al igual que las variables declaradas después de "estática": simplemente omita los signos de dólar. G :: Ejemplo sería un ejemplo de una constante global.
David Spector
5

Respondiste esto en la forma en que escribiste la pregunta: usa 'definir'. pero una vez establecido, no puede cambiar una definición.

Alternativamente, hay trucos con una constante en una clase, como class :: constant que puedes usar. También puede hacerlos variables declarando propiedades estáticas a la clase, con funciones para establecer la propiedad estática si desea cambiarla.

Robbie
fuente
5

Puede probar la palabra clave useen Funciones de cierre o Lambdas si se ajusta a su intención ... PHP 7.0 sin embargo. No, eso es mejor, sino solo una alternativa.

$foo = "New";
$closure = (function($bar) use ($foo) {
    echo "$foo $bar";
})("York");

demo | informacion

Thielicious
fuente
1

Pensemos un poco diferente:

class globe{
    static $foo = "bar";
}

Y puede usarlo y modificarlo siempre que lo desee, como:

function func(){
    echo globe::$foo;
}
Amir Fo
fuente
0

¿Qué pasa si hace uso de la función de procedimiento en lugar de variable y los llama a cualquier lugar como usted?

Por lo general, hago una colección de valores de configuración y los pongo dentro de una función con una declaración de retorno. Solo incluyo eso donde necesito hacer uso del valor global y llamar a una función particular.

function host()
{
   return "localhost";
}
Veshraj Joshi
fuente
0

$GLOBALS[] es la solución correcta, pero como estamos hablando de alternativas, una función también puede hacer este trabajo fácilmente:

function capital() {
    return my_var() . ' is the capital of Italy';
}

function my_var() {
    return 'Rome';
}
Darío Ferrer
fuente
-19

Ya no deberías usar globals, no están disponibles en PHP 5.4.

Daniel West
fuente
19
REGISTRO GLOBALES se elimina. No globales.
unity100
77
Esta respuesta, tal como está escrita, es incorrecta y debe actualizarse para reflejar el comentario de unity100. Si GLOBALS todavía está disponible, aclare qué aspectos de los vars GLOBAL han cambiado. Algo como esto.
crashwap
@RobertColumbia Publicación muy interesante, y lo tendré en cuenta para otras respuestas, pero no se aplica en este caso particular. (Espero que solo estés usando ese meta para señalar cómo una respuesta "no hagas eso" podría ser válida y no como justificación de que es así;)) " " No hagas eso " puede ser una respuesta válida . "-" puede ser "no" es ". " Pero a veces, no hay que hacer nada en su lugar. Si dejas de hacer lo incorrecto, todo comenzará a funcionar mágicamente de nuevo " . - No se aplica aquí ya que el código no está "roto". El OP solo quiere una forma "menos tipeada" de hacer las cosas. ...
robinCTS
" ¿realmente está tratando de responder la pregunta? En la mayoría de los casos, lo es " - "La mayoría", no "todos". (Incluso disputaría "la mayoría", pero no he visto suficientes respuestas para hacer un argumento informado). " En este caso, no lo es ". Y en esta "respuesta" tampoco lo es, por las mismas razones: " Peor aún, la respuesta de Murphy no propone una solución al problema " y " No da el que pregunta una herramienta o un método o cualquier cosa que se parezca a una solución a su problema ". ...
robinCTS