2011-01-16 8 views
11

En la última línea del siguiente código, tiene &2, if($page['special']&2).¿Qué significa & in & 2 en PHP?

¿Qué 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

posible duplicado de [Referencia - ¿Qué significa este símbolo en PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – Gordon

+2

En el contexto de esta pregunta y fue parte de matemática binaria, no es un operador 'por referencia' – Dmitri

+0

@Dmitri ese caso está cubierto también en la referencia vinculada. – Gordon

Respuesta

13
$page['special'] & 2 

significa

$page['special']bitwise AND2

Básicamente comprueba para ver si el 2 bit se establece en $page['special'].

Esta línea:

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

añade explícitamente a 2 $special por lo que va a satisfacer el nivel de bits y la operación y la comparación, porque decimal 2 == binario 10, con el 1 representa el bit 2 , asegurándose de que esté configurado.

La operación AND devuelve 2 si se establece el bit 2, que se resuelve en true en PHP y cumple la condición; de lo contrario, devuelve 0 que se considera false.

Un buen truco de IMO, pero no estoy seguro de lo seguro que es.

+2

¿Por qué querrías eso en lugar de un simple & legible '&& isset ($ _ REQUEST ['hidden']);'. Puede que ahora esté cansado, pero no veo la ventaja. – alexn

+1

@alexn: No tengo idea tampoco. Parece que el desarrollador que escribió ese código quería sentirse un poco inteligente. – BoltClock

+0

@alexn, ͏ @ BoltClock, la ventaja es exactamente la opuesta a la que ha citado. La ofuscación es una ventaja cuando quieres leer algo y al mismo tiempo no quieres que otros lo lean. – Pacerier

6

Es el bitwise and operator.

Parece que está usando ese bit en particular para ocultar la página.

En caso de que no sabe lo que el operador de bits es, considerar el valor 74 en binario:

0100 1010 

Si and esto con 2 (0000 0010), se obtiene:

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

o un valor distinto de cero (verdadero).

Las líneas:

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

están estableciendo que el bit basada en la clave hidden.

2

En PHP & es el operador bit a bit para AND.

lo tanto, sería AND el valor binario de $page['special'] con el valor binario de 2, que serían:

0000 0010 

lo tanto, el valor total o habrá 2 ó 0.

12

& is the bitwise AND operator. El resultado de a & b son los bits que son iguales en a y b.

Así que en este caso $page['special']&2 devuelve o 0 o 2 dependiendo de la configuración de bits de $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 también, mucho más claro. – Pacerier

0

& es el operador bitwise AND.

& 2 comprueba si se establece el segundo bit en el valor del campo especial.