Saturday 10 June 2017

What does & in &2 mean in PHP?



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 'NOTE: this page is currently hidden from the front-end navigation. Use the "Advanced Options" to un-hide it.';

Answer



$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.



No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...