2011-03-27 24 views
46

Este (versión simplificada de mi código) en el interior no funciona:No se puede acceder a la función variable global

<?php 
    $sxml = new SimpleXMLElement('<somexml/>'); 

    function foo(){ 
     $child = $sxml->addChild('child'); 
    } 

    foo(); 
?> 

¿Por qué? Quiero acceder al $sxml porque quiero registrar errores si falla foo(). foo() se llama a sí mismo recursivamente para crear una lista de directorios, por lo que me temo pasar todo el $sxml a sí mismo (como en foo($sxml)) podría dañar el rendimiento.

¿Hay alguna manera de acceder $sxml dentro de $foo sin pasarlo por un argumento? (PHP 5.2.x +)

EDIT: ¿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(); 
?> 
+0

por favor, programación orientada a objetos o simplemente pasarlo como argumento. La reutilización es clave. – mauris

+0

@thephpdeveloper Entiendo tu punto, pero recién estoy comenzando con PHP y probablemente no sea un código que reutilice. Es más un prototipo que si sale mal lo puedo tirar y empezar de cero. –

Respuesta

97

Hay que pasarlo a la función:

<?php 
    $sxml = new SimpleXMLElement('<somexml/>'); 

    function foo($sxml){ 
     $child = $sxml->addChild('child'); 
    } 

    foo($sxml); 
?> 

o declarar que global:

<?php 
    $sxml = new SimpleXMLElement('<somexml/>'); 

    function foo(){ 
     global $sxml; 
     $child = $sxml->addChild('child'); 
    } 

    foo(); 
?> 

Si la variable no es global, pero en su lugar se define en una función externa , la primera opción (pasar como argumento) funciona igual:

<?php 
    function bar() { 
     $sxml = new SimpleXMLElement('<somexml/>'); 
     function foo($sxml) { 
      $child = $sxml->addChild('child'); 
     } 
     foo($sxml); 
    } 
    bar(); 
?> 

Como alternativa, cree un closure declarando la variable en una cláusula use.

<?php 
    function bar() { 
     $sxml = new SimpleXMLElement('<somexml/>'); 
     function foo() use(&$xml) { 
      $child = $sxml->addChild('child'); 
     } 
     foo(); 
    } 
    bar(); 
?> 
+0

Solo una cosa más ... ¿y si la variable estuviera en una función primaria? (pregunta editada) :( –

+0

En su segundo ejemplo, no puede acceder a $ sxml desde foo() porque está definido localmente en barra(). Una solución podría ser: declarar $ sxml fuera de foo() y barra(), y Úselo en ambas funciones usando global. Pero como sugirió el revelador de PHP, debería usar OOP;) –

+0

Usaré OOP entonces ... Supongo que rápido y sucio significa roto :( –

19

Usted necesidad de invitar explícitamente la variable global en el ámbito funciones:

function foo(){ 
    global $sxml; 
    $child = $sxml->addChild('child'); 
} 
4

Usar 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(); 
?> 
2

otra solución es utilizar $ GLOBALS mientras que usted declara que la variable:

  $my_var = 'blabla'; // not global 
$GLOBALS['my_var'] = 'blabla'; // global (correct) 
Cuestiones relacionadas