paginas - variables globales php
No se puede acceder a la variable global dentro de la funciĆ³n (5)
Esto (versión simplificada de mi código) no funciona:
<?php
$sxml = new SimpleXMLElement(''<somexml/>'');
function foo(){
$child = $sxml->addChild(''child'');
}
foo();
?>
¿Por qué? Quiero acceder a $sxml
porque quiero registrar errores si falla foo()
. foo()
llama recursivamente para crear una lista de directorios, así que me temo que pasar todo el $sxml
sobre sí mismo (como en foo($sxml)
) podría dañar el rendimiento.
¿Hay alguna forma de acceder a $sxml
dentro de $foo
sin pasarlo como argumento? (PHP 5.2.x +)
EDITAR: ¿Qué pasa si el código se ve así, en realidad?
<?php
bar(){
$sxml = new SimpleXMLElement(''<somexml/>'');
function foo(){
$child = $sxml->addChild(''child'');
}
foo();
}
bar();
?>
Necesita invitar explícitamente la variable global al alcance de las funciones:
function foo(){
global $sxml;
$child = $sxml->addChild(''child'');
}
Si bien la respuesta principal ofrece una buena solución, me gustaría argumentar que la solución adecuada en la mayoría de las aplicaciones PHP modernas es crear una clase con una variable estática, como esta:
<?php
class xmlHelper {
private static $sxml;
public function getXML() {
return self::$sxml;
}
public function setXML($xml) {
self::$sxml = $xml;
}
}
xmlHelper::setXML(new SimpleXMLElement(''<somexml/>''));
function foo(){
$child = xmlHelper::getXML()->addChild(''child'');
}
foo();
Este enfoque le permite acceder a $sxml
desde dentro de foo()
tal como lo deseaba, pero tiene algunas ventajas sobre el enfoque global
.
- Con esta estrategia, siempre podrá poner un punto de interrupción dentro de
setXML()
para descubrir qué parte de su aplicación ha manipulado este valor, lo que no puede hacer al manipular elementos globales. - Evita contaminar el espacio de nombre global con un nombre genérico de variable
sxml
.
Tienes que pasarlo a la función:
<?php
$sxml = new SimpleXMLElement(''<somexml/>'');
function foo($sxml){
$child = $sxml->addChild(''child'');
}
foo($sxml);
?>
o declararlo global :
<?php
$sxml = new SimpleXMLElement(''<somexml/>'');
function foo(){
global $sxml;
$child = $sxml->addChild(''child'');
}
foo();
?>
Si la variable no es global, sino que se define en una función externa, la primera opción (pasar como argumento) funciona de la misma manera:
<?php
function bar() {
$sxml = new SimpleXMLElement(''<somexml/>'');
function foo($sxml) {
$child = $sxml->addChild(''child'');
}
foo($sxml);
}
bar();
?>
Alternativamente, cree un closure declarando la variable en una cláusula de use
.
<?php
function bar() {
$sxml = new SimpleXMLElement(''<somexml/>'');
function foo() use(&$xml) {
$child = $sxml->addChild(''child'');
}
foo();
}
bar();
?>
Use la palabra clave global para declarar $ sxml dentro de su función.
<?php
$sxml = new SimpleXMLElement(''<somexml/>'');
function foo(){
global $sxml;
$child = $sxml->addChild(''child'');
}
foo();
?>
otra solución es usar $ GLOBALS mientras declaras esa variable:
$my_var = ''blabla''; // not global
$GLOBALS[''my_var''] = ''blabla''; // global (correct)