2009-12-09 11 views
9

he la (simplificada) siguiente código:acceso variable global desde dentro de una clase

<?PHP 
    class A { 
     function Show(){ 
      echo "ciao"; 
     } 
    } 

    $a = new A(); 
    $b = new B(); 

    class B { 
     function __construct() { 
      $a->Show(); 
     } 
    } 
?> 

Con un poco de sorpresa, no puedo acceder a la definida globalmente variable $ a partir de dentro de la clase y obtener un Variable indefinida excepción. ¿Alguna ayuda?

Respuesta

5

¿Por qué la sorpresa? Ese es un problema de alcance de variable bastante lógico allí ...

Sugiero que use la palabra clave global o la variable $GLOBALS para acceder a su variable.

EDIT: Así, en su caso, que será:

global $a; 
$a->Show(); 

o

$GLOBALS['a']->Show(); 

EDIT 2: Y, ya Vinko es correcto, le sugiero que eche un vistazo en el manual de PHP sobre variable scope.

+4

Es sorprendente para las personas acostumbradas a las lenguas de alcance implícitamente heredada, como C. –

+0

Gotcha, Vinko. Gracias. – Franz

6

Deberá definirlo como global variable dentro del alcance de la función que desea utilizar.

function __construct() { 
    global $a; 
    $a->Show(); 
} 
18

no utilice el método global que se sugiere. Eso hace que me duela el estómago.

Pass $ a en el constructor de B.

class A { 
    function Show(){ 
      echo "ciao"; 
    } 
} 

$a = new A(); 
$b = new B($a); 

class B { 
    function __construct($a) { 
     $a->Show(); 
    } 
} 
+1

Esta es de hecho la mejor manera. – Franz

+0

En este ejemplo, ¿por qué wouldnt B extender A? – roberthuttinger

+0

@roberthuttinger - todo depende de la relación entre las dos clases. – Galen

0
<?php 
class A { 
    public function Show(){ 
     return "ciao"; 
    } 
} 

class B { 
    function __construct() { 
     $a = new A(); 
     echo $a->Show(); 
    } 
} 

$b = new B(); 
?> 
Cuestiones relacionadas