2015-08-06 14 views
16

Sto cercando di capire il codice sottostante, ma sono confuso dall'uso dell'operatore &&.
Si prega di spiegare lo scopo del funzionamento && nel codice seguenteUso insolito di && operator

function getErrors($autoClean=TRUE) { 
    $retVal = $this->getErrorMessages(); 
    $autoClean && $this->unsetErrorMessages(); 
    return $retVal; 
} 
+0

Grazie per la tua risposta. Funziona ............ –

risposta

15

Qui, && funge da operatore di cortocircuito come indicato da @robby.

  • Se si chiama getErrors(), $ autoclean sarà vero, $ this-> unsetErrorMessages() sarà eseguito .
  • Se si chiama getErrors (false), $ autoclean sarà false, $ this-> unsetErrorMessages() non sarà eseguito.

La linea ci fornisce un comportamento per impedire l'esecuzione di default di qualsiasi codice e ci offre anche possibilità di ridurre le linee di codice come

$autoClean && $this->unsetErrorMessages(); 

sarà equivalente a

if($autoClean){ 
    $this->unsetErrorMessages(); 
} 
+0

@robby è quello che ho detto, vedere la risposta, ho menzionato anche il tuo nome. L'ho appena spiegato, in modo che l'ambra non si confonda con 'if' in futuro. –

+9

Qualcosa che potrebbe essere utile notare: l'istruzione if verrà probabilmente vista come codice più pulito e più facilmente comprensibile, anche se è 3 volte più linee. Meno linee non sono sempre migliori. –

+0

true @kevin, ma alcune volte l'ottimizzazione è necessaria come quando si sviluppa un framework o qualcosa del genere –

30

Qui, && agisce come un operatore di short-circuit (si veda anche il codice di esempio here).

  • Se $autoClean viene valutato come true, sarà essere eseguito $this->unsetErrorMessages().
  • Se $autoClean viene valutato come false, $this->unsetErrorMessages() volontà non essere eseguito .

Utilizzando || invece di && sarebbe invertire questo comportamento.

Lo stesso comportamento può ovviamente essere ottenuto anche aggiungendo un'ulteriore istruzione if. In tal modo:

  • a && b() può essere riscritta come

    if (a) { 
        b(); 
    } 
    
  • a || b() può essere riscritta come

    if (!a) { 
        b(); 
    } 
    

Mentre l'uso di operatori cortocircuito può ridurre il numero di linee, può anche rendere il codice più difficile da leggere.

In termini di velocità di esecuzione, non ci dovrebbero essere differenze evidenti.


Aggiornamento

devo ritirare la mia precedente dichiarazione circa che vi sia alcuna differenza in termini di velocità di esecuzione. Date le seguenti due script di test, vale a dire una versione con l'operatore di corto circuito:

<?php 
    $a = true;                         

    function b() { global $a; $a = !$a; } 

    for ($i = 0; $i < 10000000; $i++) { 
     $a && b(); 
    } 
?> 

e una versione con una if dichiarazione:

<?php 
    $a = true;                         

    function b() { global $a; $a = !$a; } 

    for ($i = 0; $i < 10000000; $i++) { 
     if($a) { b(); } 
    } 
?> 

Si scopre che la seconda versione (con il if dichiarazione) è circa il 40% più veloce (~ 450 ms vs ~ 750 ms) sulla mia versione PHP 5.5.9 su Ubuntu 14.04 LTS (64 bit).

I risultati possono variare a seconda delle versioni e dei sistemi operativi PHP diversi, ma almeno sulla mia macchina sono costantemente presenti differenze significative nella velocità di esecuzione.

+1

Puoi anche usare la parola letterale 'or' e' and' eg 'if ((true o true) e true)' – zanderwar

+0

Fondamentalmente sta lavorando sul principio di cortocircuitazione.In caso di OR (cnd1 || cnd2), se cnd1 == true, verrà cortocircuitato l'operazione e non verrà mai eseguito per cnd2. Allo stesso modo, per AND controlla cnd2 solo se cnd1 è vero. – Pritam

+3

Qualcosa che potrebbe essere utile notare: un'istruzione equivalente if sarà probabilmente vista come codice più pulito e più facilmente comprensibile, anche se è 3 volte più linee. Meno linee non sono sempre migliori. –