2009-05-07 29 views

Respuesta

43

variables de clase estáticos pueden ser referenciados a nivel mundial, por ejemplo:

class myGlobals { 

    static $myVariable; 

} 

function a() { 

    print myGlobals::$myVariable; 

} 
+0

Usted señor, hizo mi día. ¿Pero solo funciona dentro de las clases? ¿Hay alguna manera de hacer esto fuera de una clase? – Mauker

2

No realmente. aunque puedes abusar de los que están ahí si no te importa lo feo que es.

+2

Nosotros aquí en stackoverflow no son compatibles con el comportamiento abusivo! – bytecode77

17

Te pensar lo tiene - todas las variables se crea en el espacio global se puede acceder mediante los $ GLOBALS suberglobal así:

// in global space 
$myVar = "hello"; 

// inside a function 
function foo() { 
    echo $GLOBALS['myVar']; 
} 
+1

¿Cuál es el rendimiento del uso de la matriz $ GLOBALS en comparación con simplemente usar la variable en sí? – Pacerier

+1

^Igual que cualquier otra matriz anidada, es esencialmente insignificante. Tener tu propio superglobal atrae más por la facilidad de uso (menos tipeo) y la estética. – simontemplar

1

También puede utilizar las variables de entorno del servidor, y acceder a ellas en PHP Esta es una buena manera de almacenar tal vez el acceso a la base de datos global si es propietario y exclusivamente usa el servidor

+0

Tenga en cuenta que esto solo funcionará para cadenas y no para tipos de datos complejos como objetos. – starbeamrainbowlabs

3
Class Registry { 
private $vars = array(); 
public function __set($index, $value){$this->vars[$index] = $value;} 
public function __get($index){return $this->vars[$index];} 
} 
$registry = new Registry; 

function _REGISTRY(){ 
    global $registry; 
    return $registry; 
} 

_REGISTRY()->sampleArray=array(1,2,'red','white'); 

//_REGISTRY()->someOtherClassName = new className; 
//_REGISTRY()->someOtherClassName->dosomething(); 

class sampleClass { 
    public function sampleMethod(){ 
     print_r(_REGISTRY()->sampleArray); echo '<br/>'; 
     _REGISTRY()->sampleVar='value'; 
     echo _REGISTRY()->sampleVar.'<br/>'; 

    } 
} 

$whatever = new sampleClass; 

$whatever->sampleMethod(); 
+1

Agregar una descripción a esta respuesta ayudaría a las personas a comprender lo que ha hecho. – starbeamrainbowlabs

3

Otra forma de evitar este problema es utilizar un método o variable de clase estática.

Por ejemplo:

class myGlobals { 

    public static $myVariable; 

} 

Luego, en sus funciones sólo tiene que hacer referencia a la variable global como esta:

function Test() 
{ 
echo myGlobals::$myVariable; 
} 

no tan limpio como algunos otros idiomas, pero al menos Don No tiene que seguir declarándolo global todo el tiempo.

2

Sin

Sólo hay una función de superglobales enumerados en this manual

20

Sí, es posible, pero no con las denominadas funciones "básicas" de PHP. Usted tiene que instalar una extensión llamada runkit: http://www.php.net/manual/en/runkit.installation.php

Después de eso, usted puede configurar su superglobales personalizados en php.ini como se documenta aquí: http://www.php.net/manual/en/runkit.configuration.php#ini.runkit.superglobal

+5

Esta es la única respuesta a esta pregunta que realmente responde. Los otros son básicamente 'no, pero puedes hacer esto en su lugar'. +1, desearía que fuera más alto. –

0

Otra posible truco con $GLOBALS si es necesario dentro de los proyectos pequeños:

archivo.php: (donde se define el "super-global")

$GLOBALS['xyz'] = "hello"; 

any_included_file.php:

global $xyz; //only once enough in the start of the file/method 
... 
... 
... 
... 
... 
echo $xyz;