2011-01-16 12 views
11

Nell'ultima riga del seguente codice, è &2, if($page['special']&2).Cosa significa & in & 2 in PHP?

Che cosa significa "&"?

if(isset($_REQUEST['id']))$id=(int)$_REQUEST['id']; 
else $id=0; 
if($id){ // check that page exists 
    $page=dbRow("SELECT * FROM pages WHERE id=$id"); 
    if($page!==false){ 
     $page_vars=json_decode($page['vars'],true); 
     $edit=true; 
    } 
} 
if(!isset($edit)){ 
    $parent=isset($_REQUEST['parent'])?(int)$_REQUEST['parent']:0; 
    $special=0; 
    if(isset($_REQUEST['hidden']))$special+=2; 
    $page=array('parent'=>$parent,'type'=>'0','body'=>'','name'=>'','title'=>'','ord'=>0,'description'=>'','id'=>0,'keywords'=>'','special'=>$special,'template'=>''); 
    $page_vars=array(); 
    $id=0; 
    $edit=false; 
} 

// { if page is hidden from navigation, show a message saying that 
if($page['special']&2)echo '<em>NOTE: this page is currently hidden from the front-end navigation. Use the "Advanced Options" to un-hide it.</em>'; 
+0

possibile duplicato di [Riferimento: cosa significa questo simbolo in PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – Gordon

+2

Nel contesto di questa domanda e faceva parte della matematica binaria, non un operatore 'di riferimento' – Dmitri

+0

@Dmitri che il caso è coperto anche nel riferimento collegato. – Gordon

risposta

13
$page['special'] & 2 

significa

$page['special']bitwise AND2

'fondamentalmente controlla per vedere se il bit 2 è impostato in $page['special'].

Questa linea:

if(isset($_REQUEST['hidden']))$special+=2; 

aggiunge esplicitamente 2-$special in modo che sarà soddisfare il bit a bit AND e il confronto, perché decimale 2 == binario 10, con l'1 che rappresenta il bit 2 , assicurandoti che sia impostato.

L'operazione AND restituisce 2 se è impostato 2 bit, che si risolve in true in PHP e soddisfa la condizione; altrimenti restituisce 0 che è considerato false.

Un bel trucco IMO, non sono sicuro di quanto sia sicuro.

+2

Perché dovresti farlo invece di un semplice '&& isset ($ _ REQUEST ['hidden'])'. Potrei essere stanco ora ma non vedo il vantaggio. – alexn

+1

@alexn: Nessuna idea neanche. Sembra che lo sviluppatore che ha scritto quel codice volesse sentirsi un po 'furbo. – BoltClock

+0

@alexn, ͏ @ BoltClock, il vantaggio è esattamente l'opposto di quello che hai citato. L'offuscamento è un vantaggio quando vuoi leggere qualcosa e allo stesso tempo non vuoi che gli altri lo leggano. – Pacerier

6

È il bitwise and operator.

Sembra che stia usando quel particolare bit per nascondere la pagina.

Nel caso in cui non si sa che cosa l'operatore bit a bit è, prendere in considerazione il valore 74 in binario:

0100 1010 

Se and questo con 2 (0000 0010), si ottiene:

0100 1010 
0000 0010 
---- ---- 
0000 0010 

o un valore diverso da zero (true).

Le linee:

$special=0; 
if(isset($_REQUEST['hidden']))$special+=2; 

stanno fissando quel po 'in base alla chiave hidden.

2

In PHP & è l'operatore bit a bit per AND.

Quindi sarebbe AND il valore binario $page['special'] con il valore binario 2, che sarebbe:

0000 0010 

Quindi il valore complessivo sarà o 2 o 0.

12

& is the bitwise AND operator. Il risultato di a & b corrisponde ai bit uguali in a e b.

Quindi in questo caso $page['special']&2 rendimenti sia 0 o 2 a seconda del modello di bit di $page['special']:

**** **** **** **** **** **** **** **X* // $page['special'] 
& 0000 0000 0000 0000 0000 0000 0000 0010 // 2 
========================================= 
    0000 0000 0000 0000 0000 0000 0000 00X0 // $page['special'] & 2 
+0

͏ + 1 troppo, più chiaro. – Pacerier

0

& è l'operatore bitwise AND.

& 2 verifica se il secondo bit nel valore del campo speciale è impostato.