2010-03-07 13 views
13

in PHP5 posso dichiarare un valore const a una classe:const vs statico in PHP

class config 
{ 
    const mailserver = 'mx.google.com'; 
} 

ma posso anche dichiarare public static:

class config 
{ 
    public static $mailserver = 'mx.google.com'; 
} 

In caso di un file di configurazione che ho ci sarà più tardi, come ad esempio:

imap_connect(config::$mailserver ... 
imap_connect(config::mailserver ... 

Quale opzione pensi che sia meglio usare ?? (più veloce, meno carico di memoria, ecc.)

Grazie.

risposta

43

La variabile statica può essere modificata, quella const non può. La considerazione principale dovrebbe essere data al fatto che le variabili di configurazione possano essere modificate in fase di esecuzione, non quale sia più veloce. La differenza di velocità tra i due (se c'è) è così minima che non vale la pena pensarci.

1

Inoltre, a causa di ciò che Yacoby ha detto sopra, ci sono alcune cose che puoi fare con una variabile statica che non puoi fare con un CONST, ad esempio assegnare il risultato di una chiamata di metodo runtime alla variabile.

8

funzione dell'uso ritorno globale

0,0096, 0,0053, 0,0056, 0,0054, 0,0072, 0,0063, 0,006, 0,0054, 0,0054, 0,0055, 0,005, 0,0057, 0,0053, 0,0049, 0,0064, 0,0054, 0.0053, 0.0053, 0,0061, 0,0059, 0,0076, config1

utilizzare Get esempio normale

0,0101, 0,0089, 0,0105, 0,0088, 0,0107, 0,0083, 0,0094, 0,0081, 0,0106, 0,0093, 0,0098, 0,0092, 0,009, 0,0087, 0,0087, 0,0093, 0,0095, 0,0101, 0,0086, 0,0088, 0,0082, config2

uso static var

0,0029, 0,003, 0,003, 0,0029, 0,0029, 0,0029, 0,003, 0,0029, 0,003, 0,0031, 0,0032, 0,0031, 0,0029, 0,0029, 0,0029, 0,0029, 0,0031, 0,0029, 0,0029, 0,0029, 0,0029, config3

uso const var 0.0033, 0.0031, 0.0031, 0.0031, 0.0031, 0.0031, 0,0032, 0,0031, 0,0031, 0,0031, 0,0031, 0,0034, 0,0031, 0,0031, 0,0033, 0,0031, 0,0037, 0,0031, 0,0031, 0,0032, 0,0031 , config4

function getTime() { 
    $timer = explode(' ', microtime()); 
    $timer = $timer[1] + $timer[0]; 
    return $timer; 
} 

$config["time"] = "time"; 

class testconfig2 
{ 
    public $time = "time"; 
    static $instance; 
    static function getInstance() 
    { 
     if(!isset(self::$instance)) 
      self::$instance = new testconfig2(); 
     return self::$instance; 
    } 
} 

class testconfig3 
{ 
    static $time = "time"; 
} 

class testconfig4 
{ 
    const time = "time"; 
} 

function getConfig1() 
{ 
    global $config; 
    return $config; 
} 

$burncount = 2000; 
$bcount = 22; 

for($lcnt =1;$lcnt < $bcount;$lcnt++){ 
$start = getTime(); 
for($i=1;$i< $burncount;$i++) 
{ 
    $gs=getConfig1(); 
    $t = $gs["time"]; 
} 
$end = getTime(); 
echo round($end - $start,4).', '; 
} 
echo ' config1<br/>'; 



for($lcnt =1;$lcnt < $bcount;$lcnt++){ 
$start = getTime(); 
for($i=1;$i< $burncount;$i++) 
{ 
    $gs=testconfig2::getInstance(); 
    $t = $gs->time; 
} 
$end = getTime(); 
echo round($end - $start,4).', '; 
} 
echo ' config2<br/>'; 



for($lcnt =1;$lcnt < $bcount;$lcnt++){ 
$start = getTime(); 
for($i=1;$i< $burncount;$i++) 
{ 
    $gs=testconfig3::$time; 
    $t = $gs; 
} 
$end = getTime(); 
echo round($end - $start,4).', '; 
} 
echo ' config3<br/>'; 



for($lcnt =1;$lcnt < $bcount;$lcnt++){ 
$start = getTime(); 
for($i=1;$i< $burncount;$i++) 
{ 
    $gs=testconfig4::time; 
    $t = $gs; 
} 
$end = getTime(); 
echo round($end - $start,4).', '; 
} 
echo ' config4<br/>'; 
?> 

3

Un'altra differenza tra const e statico è che alcune variabili li array ke non sono ammessi nelle costanti di classe, in modo

class mytest 
{ 
    public static $c = array(1=> 'hello', 2=>'world'); 
} 

opere, ma

class mytest 
{ 
    const c = array(1=> 'hello', 2=>'world'); 
} 

no.

+3

Non più vero da PHP5.6 – Raffaello

4

È possibile utilizzare le costanti per i valori degli argomenti delle funzioni predefiniti, in cui le variabili statiche non sono consentite.

+0

Sebbene sia un punto valido, questo non affronta la domanda "quale è meglio essere utilizzato?". Forse, se la domanda fosse "che è meglio usare * in questo scenario *", sì - ma nel complesso, no. – newfurniturey

+1

@newfurniturey, non sono d'accordo con il tuo commento. Sottolineando una limitazione dell'uno o dell'altro mostra necessariamente come l'altro potrebbe essere migliore. E, sembra che siccome questo è precisamente l'argomento della risposta più popolare e accettata, non penso di essere solo in questo. – mkoistinen

-2

Sia "const" che "public static" sono malvagie!

Come notato da Keith Humm, un const non può essere il risultato di un metodo runtime.E, anche se inizialmente pensavo che fosse corretto nel dire che si può "assegnare il risultato di una chiamata al metodo runtime a una variabile (statica)", il mio test sta dimostrando che bisogna fare qualche salto per fare questo.

Questo può sembrare un punto secondario, ma potrebbe essere il seme di un futuro disastro. Supponiamo che io sia costretto a passare a un metodo di inizializzazione per qualche motivo inopportuno in futuro. Non ho alcun problema se questo significa che devo apportare alcune modifiche nei file sotto il mio controllo. Ma cosa succede se cambio una libreria che ho inviato in lungo e in largo ad altri sviluppatori?

Stavo per scrivere che, per lo meno, dovrò dire a tutti gli altri (e 'Future Me') di apportare modifiche ai file THEIR se vogliono aggiornare alla mia nuova versione. Nel caso di "const", dovranno aggiungere un "$" ovunque lo utilizzino. In altri scenari, i miei test oggi indicano che potrebbero dover apportare meno, ma alcuni, cambiamenti.

Supponendo che il codice orientato agli oggetti, seguo consigli generali che ho visto per molte lingue, e ha bisogno di attenzione in più per PHP - EVITARE proprietà visibili di alcun genere se const, statica o qualsiasi altra cosa. Usa i metodi 'getter'!

Questo può sembrare un ridicolo colpo di performance e uno stile di codice brutto, ma a meno che non si possa prevedere il futuro, è l'unica strada da percorrere.

Vedere: risposta di Tieerd Visser a How to initialize static variables e dargli un bernoccolo. Ignora i suoi detrattori: se sei interessato alle prestazioni, al di sopra di possibili bug e altri disastri, passa a un'altra lingua.