Domanda

Il preprocessore C ++ #define è totalmente diverso.

PHP define () è diverso dalla semplice creazione di una var?

define("SETTING", 0);  
$something = SETTING;

vs

$setting = 0;  
$something = $setting;
È stato utile?

Soluzione

l'operazione 'define' è piuttosto lenta - confermata dal profiler di xdebug.

Ecco i benchmark di http: //t3.dotgnu. info / blog / php / my-first-php-extension.html :

  • puro 'define'
    380.785 recuperi / sec
    14.2647 significa msec / prima risposta

  • costanti definite con l'estensione 'hidef'
    930.783 recuperi / sec
    6.30279 significa msec / prima risposta


aggiornamento link non funzionante

Il post sul blog sopra citato ha lasciato Internet. Può ancora essere visualizzato qui tramite Wayback Machine . Ecco un altro articolo simile .

Le librerie a cui fa riferimento l'autore sono disponibili qui (apc_define_constants) e qui (estensione hidef) .

Altri suggerimenti

In generale, l'idea di una costante deve essere costante , (sembra divertente, vero?;)) all'interno del tuo programma . Ciò significa che il compilatore (interprete) sostituirà "FOOBAR" con il valore di FOOBAR nell'intero script.

Tanto per la teoria e i vantaggi, se si compila. Ora PHP è piuttosto dinamico e nella maggior parte dei casi non noterai nulla di diverso perché lo script PHP viene compilato ad ogni esecuzione. Afai-can-tell non dovrebbe vedere una notevole differenza di velocità tra costanti e variabili a meno che non si usi una cache con codice byte come APC , Zend Optimizer o eAccelerator . Quindi può avere senso.

Tutti gli altri vantaggi / svantaggi delle costanti sono già stati annotati qui e possono essere trovati nel manuale di PHP .

php > $cat='';$f=microtime(1);$s='cowcow45';$i=9000;while ($i--){$cat.='plip'.$s.'cow';}echo microtime(1)-$f."\n";

,00689506530762

php > $cat='';$f=microtime(1);define('s','cowcow45');$i=9000;while ($i--){$cat.='plip'.s.'cow';}echo microtime(1)-$f."\n";

,00941896438599

Questo è ripetibile con risultati simili. Mi sembra che le costanti siano un po 'più lente da definire e / o utilizzare rispetto alle variabili.

Ecco le differenze, dal manuale

  • Le costanti non hanno un segno di dollaro ($) prima di loro;
  • Le costanti possono essere definite solo usando la funzione define (), non per semplice assegnazione;
  • Le costanti possono essere definite e accessibili ovunque, indipendentemente dalle regole di scoping variabile;
  • Le costanti non possono essere ridefinite o indefinite una volta impostate; e
  • Le costanti possono valutare solo valori scalari.

Per me, il vantaggio principale è l'ambito globale. Certamente non mi preoccupo della loro efficienza: usali ogni volta che hai bisogno di un valore scalare globale che non dovrebbe essere modificabile.

NON sembra efficiente. (E sto basando tutte le ipotesi qui su un commento da php.net, non ho ancora fatto i benchmark da solo.)

il richiamo di una costante richiederà il doppio del tempo di richiamo di una variabile.

controllare l'esistenza di una Costante richiederà 2ms e 12ms per un falso positivo!

Ecco un punto di riferimento dai commenti della pagina di definizione nel documento online di php.

  

Prima di usare definite () dai un'occhiata ai seguenti benchmark:

true                                       0.65ms
$true                                      0.69ms (1)
$config['true']                            0.87ms
TRUE_CONST                                 1.28ms (2)
true                                       0.65ms
defined('TRUE_CONST')                      2.06ms (3)
defined('UNDEF_CONST')                    12.34ms (4)
isset($config['def_key'])                  0.91ms (5)
isset($config['undef_key'])                0.79ms
isset($empty_hash[$good_key])              0.78ms
isset($small_hash[$good_key])              0.86ms
isset($big_hash[$good_key])                0.89ms
isset($small_hash[$bad_key])               0.78ms
isset($big_hash[$bad_key])                 0.80ms
  

PHP versione 5.2.6, Apache 2.0, Windows XP

     

Ogni istruzione è stata eseguita 1000 volte e con un overhead di 12ms attivo   1000 chiamate non faranno strappare i capelli agli utenti finali,   genera alcuni risultati interessanti se confrontati con if (true):

     

1) if ($ true) era praticamente identico 2) if (TRUE_CONST) era quasi   due volte più lento - immagino che la sostituzione non sia stata fatta durante la compilazione   il tempo (ho dovuto ricontrollare questo!) 3) definito () è 3 volte più lento   se la costante esiste 4) definito () è 19 VOLTE PIÙ LENTO se il   la costante non esiste! 5) isset () è straordinariamente efficiente a prescindere   di ciò che ci si lancia (ottime notizie per chiunque implementi array   sistemi di eventi guidati - io!)

     

Potrebbe voler evitare if (definito ('DEBUG')) ...

da tris + php a tfconsulting dot com dot au 26-mar-2009 06:40

http://us.php.net/manual/en/ function.defined.php # 89886

Definire è un semplice senso statico, il che significa che il suo valore non può essere modificato durante il runtime mentre la variabile è un senso dinamico perché è possibile manipolarne liberamente il valore lungo il processo.

Differenze principali:

  • define è costante, variabile è variabile
  • hanno diversi scopi / visibilità

Quando eseguo i test di velocità, le costanti impostate e scaricate sono molto più veloci rispetto all'impostazione delle variabili e al loro scaricamento.

Non sono sicuro dell'efficienza, ma è più che creare un var:

  • È una costante: non è possibile ridefinire o riassegnare questa IMPOSTAZIONE.
  • Se la definizione non viene trovata, $ qualcosa è impostato su " SETTING " ;, che è utile, ad esempio, in i18n: se manca una traduzione (cioè la definizione corrispondente è il file di localizzazione), vediamo una grande parola in maiuscolo, abbastanza visibile ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top