De acuerdo con la mayoría de las reglas de alcance de los lenguajes de programación, puedo acceder a variables que están definidas fuera de las funciones dentro de ellas, pero ¿por qué no funciona este código?
<?php
$data = 'My data';
function menugen() {
echo "[" . $data . "]";
}
menugen();
?>
La salida es []
.
Respuestas:
No está funcionando porque se tiene que declarar las variables globales podrás acceder a:
$data = 'My data'; function menugen() { global $data; // <-- Add this line echo "[" . $data . "]"; } menugen();
De lo contrario, puede acceder a él como
$GLOBALS['data']
. Consulte Alcance variable .Incluso si está un poco fuera de tema, le sugiero que evite el uso de globales y prefiera pasar como parámetros.
fuente
This script will not produce any output because the echo statement refers to a local version of the $a variable, and it has not been assigned a value within this scope.
Puede realizar una de las siguientes acciones:
<?php $data = 'My data'; function menugen() { global $data; echo "[" . $data . "]"; } menugen();
O
<?php $data = 'My data'; function menugen() { echo "[" . $GLOBALS['data'] . "]"; } menugen();
Dicho esto, el uso excesivo de globales puede generar un código deficiente. Por lo general, es mejor pasar lo que necesita. Por ejemplo, en lugar de hacer referencia a un objeto de base de datos global, debe pasar un identificador a la base de datos y actuar en consecuencia. Esto se llama inyección de dependencia . Le hace la vida mucho más fácil cuando implementa pruebas automatizadas (lo que debería).
fuente
Es una cuestión de alcance. En resumen, las variables globales deben evitarse para :
O debe pasarlo como parámetro:
$data = 'My data'; function menugen($data) { echo $data; }
O tenerlo en una clase y acceder a él
class MyClass { private $data = ""; function menugen() { echo this->data; } }
Consulte la respuesta de @MatteoTassinari también, ya que puede marcarla como global para acceder a ella, pero las variables globales generalmente no son necesarias, por lo que sería prudente reconsiderar su codificación.
fuente
menugen()
, implica que habrá más cosas que simplemente generar un menú. Por ejemplo, ¿qué hay de extender ese menú para agregar más elementos de una fuente diferente, qué hay de seleccionar la página actualmente seleccionada que está en el menú. Tener variables globales aleatorias y lógica por todas partes exige un diseño de programación orientada a objetos. El hecho de que PHP / JS no necesita estar estructurado es una de las principales razones por las que encuentra mucho código desordenado y torpe. Se puede hacer muy bien, pero permite que las personas no piensen en la mantenibilidad en el futuro.Otra forma de hacerlo:
<?php $data = 'My data'; $menugen = function() use ($data) { echo "[".$data."]"; }; $menugen();
ACTUALIZACIÓN 2020-01-13: solicitado por Peter Mortensen
A partir de PHP 5.3.0 tenemos soporte de funciones anónimas que pueden crear cierres. Un cierre puede acceder a la variable que se crea fuera de su alcance.
En el ejemplo, el cierre puede acceder
$data
porque fue declarado en lause
cláusula.fuente
Durante muchos años siempre he usado este formato:
<?php $data = "Hello"; function sayHello(){ echo $GLOBALS["data"]; } sayHello(); ?>
Lo encuentro sencillo y fácil de seguir. $ GLOBALS es la forma en que PHP le permite hacer referencia a una variable global. Si ha utilizado cosas como $ _SERVER, $ _POST, etc., entonces ha hecho referencia a una variable global sin saberlo.
fuente
$GLOBAL
(texto) o$GLOBALS
(código de muestra)? (Responda editando su respuesta , no aquí en los comentarios (según corresponda).)Necesitas pasar la variable a la función:
$data = 'My data'; function menugen($data) { echo $data; }
fuente
<?php $data = 'My data'; $menugen = function() use ($data) { echo "[ $data ]"; }; $menugen(); ?>
También puedes simplificar
echo "[" . $data . "]"
a
echo "[$data]"
fuente
echo "[" . $data . "]"
yecho "[ $data ]"
no son iguales (dos espacios adicionales en la salida para este último).Si lo desea, puede utilizar la función "definir", pero esta función crea una constante que no se puede cambiar una vez definida.
<?php define("GREETING", "Welcome to W3Schools.com!"); function myTest() { echo GREETING; } myTest(); ?>
Constantes PHP
fuente