work variable paginas not manejo globales entre does declarar php variables scope global-variables

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 .

  1. 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.
  2. 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)