2011-01-16 46 views
11

Trong dòng cuối cùng của mã sau, mã này có &2, if($page['special']&2).& in & 2 có nghĩa là gì trong PHP?

& có nghĩa là gì?

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

bản sao có thể có của [Tham khảo - Biểu tượng này có ý nghĩa gì trong PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – Gordon

+2

Trong bối cảnh của câu hỏi này và là một phần của toán học nhị phân, không phải là toán tử 'by reference' – Dmitri

+0

@Dmitri trường hợp đó cũng được đề cập trong tham chiếu được liên kết. – Gordon

Trả lời

13
$page['special'] & 2 

nghĩa

$page['special']bitwise AND2

Về cơ bản nó sẽ kiểm tra xem các bit 2 được đặt trong $page['special'].

dòng này:

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

rõ ràng thêm 2-$special để nó sẽ đáp ứng các phép toán AND hoạt động và so sánh, bởi vì số thập phân 2 == nhị phân 10, với 1 đại diện cho các bit 2 , đảm bảo nó được thiết lập.

Hoạt động AND trả về 2 nếu 2 bit được đặt, giải quyết thành true bằng PHP và thỏa mãn điều kiện; nếu không nó trả về 0 được coi là false.

Hoàn toàn là thủ thuật gọn gàng IMO, không chắc chắn mức độ an toàn của nó.

+2

Tại sao bạn muốn thay vì một '&& isset đơn giản, có thể đọc được ($ _ REQUEST ['hidden']);'. Tôi có thể mệt mỏi nhưng tôi không thấy lợi thế. – alexn

+1

@alexn: Không có ý tưởng. Có vẻ như nhà phát triển đã viết mã đó muốn cảm thấy một chút thông minh. – BoltClock

+0

@alexn, ͏ @ BoltClock, Lợi thế hoàn toàn trái ngược với những gì bạn đã trích dẫn. Obfuscation là một lợi thế khi bạn muốn đọc một cái gì đó và đồng thời không muốn người khác đọc nó. – Pacerier

6

Đó là bitwise and operator.

Dường như nó đang sử dụng bit cụ thể đó để ẩn trang.

Trong trường hợp bạn không biết những gì các nhà điều hành Bitwise là, xem xét giá trị 74 trong hệ nhị phân:

0100 1010 

Nếu bạn and này với 2 (0000 0010), bạn nhận được:

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

hoặc giá trị khác không (đúng).

Các dòng:

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

đang thiết rằng bit dựa trên phím hidden.

2

Trong PHP & là toán tử bitwise cho AND.

Vì vậy, nó sẽ AND giá trị nhị phân của $page['special'] với giá trị nhị phân của 2, mà sẽ là:

0000 0010 

Vì vậy, các tổng giá trị sẽ thể là 2 hoặc 0.

12

& is the bitwise AND operator. Kết quả của a & b là các bit bằng nhau trong ab.

Vì vậy, trong trường hợp này $page['special']&2 lợi nhuận hoặc 0 hoặc 2 tùy thuộc vào mô hình chút $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 quá, rõ ràng hơn. – Pacerier

0

& là các nhà điều hành bitwise AND.

& 2 kiểm tra xem bit thứ hai trong giá trị của trường đặc biệt có được đặt hay không.