2012-02-29 12 views
7

Questa è una versione semplificata di ciò che voglio ottenere:Come cambio un valore di variabili statiche in PHP?

Nel mio script voglio una variabile che cambi true e false ogni volta che lo script viene eseguito.

<?php 
    static $bool = true; 

    // Print differente messages depending on $bool 
    if($bool == true) 
     echo "It's true!"; 
    else 
     echo "It's false!"; 

    // Change $bools value 
    if($bool == true) 
     $bool = false 
    else 
     $bool = true; 
?> 

Ma ovviamente quello che sto facendo è sbagliato. La variabile $bool è costantemente true e non ho pienamente compreso il concetto di variabili statiche che presumo. Che cosa sto facendo di sbagliato?

risposta

14

PHP non è in grado di mantenere valori variabili tra le richieste. Ciò significa che ogni volta che viene chiamato lo script, la variabile $bool verrà impostata su true. Se si desidera mantenere il valore tra le richieste, è necessario utilizzare sessions oppure, se si desidera condividere la variabile tra le sessioni, un meccanismo di memorizzazione nella cache come APC o Memcache.

Inoltre, static è utilizzato in PHP per dichiarare una variabile condivisa a livello di classe. Viene quindi utilizzato nelle classi e accessibile come self::$variableName; o Foo::$variableName

Ulteriori informazioni su static properties here. Da i documenti:

Dichiarare le proprietà di classe oi metodi come statici li rende accessibili senza richiedere un'istanza della classe. Non è possibile accedere a una proprietà dichiarata come statica con un oggetto classe istanziato (sebbene un metodo statico possa).

Inoltre, notare che la parola static è stata sovraccaricata da PHP 5.3, e può anche essere usato per denotare Late Static Binding, mediante l'uso di static::

+0

Hmm .. Quindi, se spostassi la variabile statica in una classe, sarei quindi in grado di cambiare valore tra le esecuzioni del mio script principale? – Weblurk

+0

No, vedi la mia risposta. – BenM

+4

No. Statico può essere utilizzato per dichiarare le variabili di classe o all'interno di una funzione per dichiarare una variabile che persiste sulle chiamate di funzione, ma non sulle esecuzioni dello script. –

2

Un valore statico non verrà mantenuto durante le esecuzioni. Ogni volta che lo script viene eseguito $ bool viene inizializzato. Penso che dovresti mantenere questo valore in un file per mantenerlo semplice.

+0

Ho pensato che fosse il punto con le variabili statiche, che persistono sulle esecuzioni. Preferirei non tenerlo in un file separato o è l'unica soluzione? – Weblurk

+0

Puoi usare Memcache, APC, Redis, un file ... come vuoi. Ma devi conservare il valore corrente della variabile da qualche parte. –

2

Penso che è necessario per capire meglio il punto di un variabile statica. Lo storage per la variabile viene allocato (e deallocato) sullo stack di chiamate, quindi dal punto di vista dell'ingegneria del software, il suo valore non può essere modificato in fase di esecuzione.

Ci sono soluzioni migliori come suggerito sopra per questo.

+1

In realtà, le variabili statiche in PHP non sono statiche .. i loro valori possono essere modificati durante l'esecuzione. È solo una variabile condivisa di una classe. – PatrikAkerstrand

+0

Abilita codice come 'class Lookup {protected static $ _cache = array(); public function expensiveLookup ($ x) {if (! isset (auto :: $ _ cache [$ x]) {self :: $ _ cache [$ x] = $ this -> _ lookup ($ x);} return self :: $ _cache [$ x];}} ' – PatrikAkerstrand