13
votes

In the last line of the following code, it has &2, if($page['special']&2).

What does & mean?

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>';
5
In the context of this question & was part of binary math, not a 'by reference' operatorDmitri
@Dmitri that case is covered in the linked reference as well.Gordon

5 Answers

16
votes
$page['special'] & 2

means

$page['special'] bitwise AND 2

It basically checks to see if the 2 bit is set in $page['special'].

This line:

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

explicitly adds 2 to $special so that it'll satisfy the bitwise AND operation and comparison, because decimal 2 == binary 10, with the 1 representing the 21 bit, ensuring it is set.

The AND operation returns 2 if the 2 bit is set, which resolves to true in PHP and satisfies the condition; otherwise it returns 0 which is considered false.

Quite a neat trick IMO, not sure how secure it is though.

12
votes

& is the bitwise AND operator. The result of a & b are the bits that are equal in a and b.

So in this case $page['special']&2 returns either 0 or 2 depending on the bit pattern of $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
8
votes

It's the bitwise and operator.

It looks like it's using that particular bit to hide the page.

In case you don't know what the bitwise operator is, consider the value 74 in binary:

0100 1010

If you and this with 2 (0000 0010), you get:

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

or a non-zero (true) value.

The lines:

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

are setting that bit based on the hidden key.

2
votes

In PHP & is the bitwise operator for AND.

So it would AND the binary value of $page['special'] with the binary value of 2, which would be:

0000 0010

So the overall value will either be 2 or 0.

0
votes

& is the bitwise AND operator.

& 2 checks whether the second bit in the special field's value is set.