function foo () {
global $var;
// rest of code
}
En mis pequeños proyectos PHP, suelo seguir el camino procedimental. Generalmente tengo una variable que contiene la configuración del sistema, y cuando necesito acceder a esta variable en una función, lo hago global $var;
.
¿Es esta una mala práctica?
php
global-variables
global
KRTac
fuente
fuente
Respuestas:
Cuando la gente habla de variables globales en otros lenguajes, significa algo diferente a lo que hace en PHP. Eso es porque las variables no son realmente globales en PHP. El alcance de un programa PHP típico es una solicitud HTTP. Las variables de sesión en realidad tienen un alcance más amplio que las variables "globales" de PHP porque generalmente abarcan muchas solicitudes HTTP.
A menudo (¿siempre?) Puede llamar a funciones miembro en métodos
preg_replace_callback()
como este:preg_replace_callback('!pattern!', array($obj, 'method'), $str);
Consulte devoluciones de llamada para obtener más información.
El punto es que los objetos se han atornillado a PHP y de alguna manera provocan cierta incomodidad.
No se preocupe demasiado por aplicar estándares o construcciones de diferentes lenguajes a PHP. Otro error común es tratar de convertir PHP en un lenguaje puro de programación orientada a objetos colocando modelos de objetos encima de todo.
Como cualquier otra cosa, use variables "globales", código de procedimiento, un marco particular y POO porque tiene sentido, resuelve un problema, reduce la cantidad de código que necesita escribir o lo hace más fácil de mantener y de entender, no porque crea debieras.
fuente
array ($obj, 'callbackMethod')
en llamadas apreg_replace_callback()
? (Lo sé, he caído presa de esteLas variables globales, si no se utilizan con cuidado, pueden hacer que los problemas sean más difíciles de encontrar. Digamos que solicita un script php y recibe una advertencia que le dice que está intentando acceder a un índice de una matriz que no existe en alguna función.
Si la matriz a la que está intentando acceder es local a la función, verifique la función para ver si ha cometido un error allí. Puede ser un problema con una entrada a la función, por lo que verifica los lugares donde se llama a la función.
Pero si esa matriz es global, debe verificar todos los lugares donde usa esa variable global, y no solo eso, debe averiguar en qué orden se accede a esas referencias a la variable global.
Si tiene una variable global en un fragmento de código, es difícil aislar la funcionalidad de ese código. ¿Por qué querrías aislar la funcionalidad? Para que pueda probarlo y reutilizarlo en otro lugar. Si tiene algún código que no necesita probar y no necesitará reutilizar, entonces usar variables globales está bien.
fuente
estoy de acuerdo con cletus. agregaría dos cosas:
saludos cordiales, don
fuente
$DB = 'foo';
¿Quién puede argumentar en contra de la experiencia, los títulos universitarios y la ingeniería de software? Yo no. Solo diría que al desarrollar aplicaciones PHP de una sola página orientadas a objetos, me divierto más cuando sé que puedo construir todo desde cero sin preocuparme por las colisiones de espacios de nombres. Construir desde cero es algo que muchas personas ya no hacen. Tienen un trabajo, una fecha límite, una bonificación o una reputación de la que preocuparse. Estos tipos tienden a usar tanto código prediseñado con mucho en juego, que no pueden arriesgarse a usar variables globales en absoluto.
Puede ser malo usar variables globales, incluso si solo se usan en el área global de un programa, pero no nos olvidemos de aquellos que solo quieren divertirse y hacer que algo funcione .
Si eso significa usar algunas variables (<10) en el espacio de nombres global, eso solo se usa en el área global de un programa, que así sea. Sí, sí, MVC, inyección de dependencia, código externo, bla, bla, bla, bla. Pero, si ha contenido el 99,99% de su código en espacios de nombres y clases, y el código externo está en un espacio aislado, el mundo no se acabará (repito, el mundo no se acabará) si utiliza una variable global.
Generalmente, no diría que usar variables globales es una mala práctica . Yo diría que usar variables globales (banderas y similares) fuera del área global de un programa es buscar problemas y (a la larga) desaconsejado porque puede perder la pista de sus estados con bastante facilidad. Además, diría que cuanto más aprenda, menos dependerá de las variables globales porque habrá experimentado la "alegría" de rastrear los errores asociados con su uso. Esto solo lo incentivará a encontrar otra forma de resolver el mismo problema. Casualmente, esto tiende a empujar a las personas de PHP en la dirección de aprender a usar los espacios de nombres y las clases (miembros estáticos, etc.).
El campo de la informática es vasto. Si asustamos a todos para que no hagan algo porque lo etiquetamos como malo , entonces pierden la diversión de comprender verdaderamente el razonamiento detrás de la etiqueta.
Use variables globales si es necesario, pero luego vea si puede resolver el problema sin ellas. Las colisiones, las pruebas y la depuración significan más cuando comprendes íntimamente la verdadera naturaleza del problema, no solo una descripción del problema.
fuente
Podemos ilustrar este problema con el siguiente pseudocódigo
function foo() { global $bob; $bob->doSomething(); }
Tu primera pregunta aquí es obvia
¿Estas confundido? Bueno. Acaba de aprender por qué los globales son confusos y se consideran una mala práctica. Si este fuera un programa real, lo siguiente que te divertirás es buscar todas las instancias de
$bob
y esperar que encuentres el correcto (esto empeora si$bob
se usa en todas partes). Peor aún, si alguien más va y define$bob
(o si olvidó y reutilizó esa variable) su código puede romperse (en el ejemplo de código anterior, tener el objeto incorrecto, o ningún objeto en absoluto, causaría un error fatal). Dado que prácticamente todos los programas PHP hacen uso de código como,include('file.php');
su trabajo, mantener un código como este se vuelve exponencialmente más difícil cuanto más archivos agrega.¿Cómo evitamos Globals?
La mejor forma de evitar los globales es una filosofía llamada Inyección de dependencia . Aquí es donde pasamos las herramientas que necesitamos a la función o clase.
function foo(\Bar $bob) { $bob->doSomething(); }
Esto es mucho más fácil de entender y mantener. No se puede adivinar dónde
$bob
se configuró porque la persona que llama es responsable de saber eso (nos está pasando lo que necesitamos saber). Mejor aún, podemos usar declaraciones de tipos para restringir lo que se pasa. Entonces sabemos que$bob
es una instancia de laBar
clase o una instancia de un hijo deBar
, lo que significa que sabemos que podemos usar los métodos de esa clase. Combinado con un autocargador estándar (disponible desde PHP 5.3), ahora podemos rastrear dóndeBar
está definido. PHP 7.0 o posterior incluye declaraciones de tipo expandidas, donde también puede usar tipos escalares (comoint
ostring
).fuente
$bob = Bar::instance();
hacerlo cuando lo necesite.Como:
global $my_global; $my_global = 'Transport me between functions'; Equals $GLOBALS['my_global']
es una mala práctica (como Wordpress
$pagenow
) ... hmmmConsidere esto:
$my-global = 'Transport me between functions';
es un error de PHP Pero:
$GLOBALS['my-global'] = 'Transport me between functions';
NO es un error, los guiones no chocarán con las variables "comunes" declaradas por el usuario, como
$pagenow
. Y el uso de MAYÚSCULAS indica una superglobal en uso, fácil de detectar en el código o rastrear con buscar en archivosUso guiones, si me da pereza construir clases de todo para una sola solución, como:
$GLOBALS['PREFIX-MY-GLOBAL'] = 'Transport me ... ';
Pero en casos de un uso más amplio, utilizo ONE global como matriz:
$GLOBALS['PREFIX-MY-GLOBAL']['context-something'] = 'Transport me ... '; $GLOBALS['PREFIX-MY-GLOBAL']['context-something-else']['numbers'][] = 'Transport me ... ';
Esto último es para mí, una buena práctica en los objetivos o el uso de "cola light", en lugar de desordenar con clases singleton cada vez para "almacenar en caché" algunos datos. Por favor, haga un comentario si me equivoco o si me falta algo estúpido aquí ...
fuente