php中,變量實際分爲兩部分,一部分爲變量名,另一部分爲變量內容.對變量而言,&符使得不同的名字的變量訪問同一個變量內容,這裏的名字指的是變量名,注意函數其實也是變量,同時&符號也經常作爲一種位運算符參與運算,以下爲工作中遇到的巧妙使用&符的場景,本文會持續跟新.
變量篇
1.使用&符優化foreach()
$arr = [
['name'=>'測試1','time'=>'2016-03-01','status'=>'1'],
['name'=>'測試2','time'=>'2016-03-02','status'=>'2'],
['name'=>'測試3','time'=>'2016-03-03','status'=>'3'],
['name'=>'測試4','time'=>'2016-04-01','status'=>'1'],
['name'=>'測試5','time'=>'2016-04-02','status'=>'2'],
['name'=>'測試6','time'=>'2016-04-03','status'=>'3'],
];
上面爲數據庫中查詢出的一段數據 現在需要將time字斷轉換爲時間戳 status 1,2,3對應待審覈 審覈中 已審覈
我們經常會遇到這樣的情況,特別是在編寫app接口時,常見的方法如下:
foreach($arr as $key=>$val){
$arr[$key]['time'] = strtotime($val['time']);
if($val['status'] == '1'){
$arr[$key]['status'] = '待審覈';
}else if($val['status'] == '2'){
$arr[$key]['status'] = '審覈中';
}else{
$arr[$key]['status'] = '已審覈';
}
}
實際上我們可以使用&符來優化一下
foreach($arr as &$val){
$val['time'] = strtotime($val['time']);
if($val['status'] == '1'){
$val['status'] = '待審覈';
}else if($val['status'] == '2'){
$val['status'] = '審覈中';
}else{
$val['status'] = '已審覈';
}
}
上述優化的好處是我們節省了保存$key的內存空間(如果是個很大的數組就有意義) &引用指向統一內存空間 執行結果是一樣的
2使用&符號改變函數參數值
有這麼個情況,如下:
function test($a, $b){
if($a > $b){
return $a-$b;
}else{
return $a+$b;
}
}
我們有一個函數test,我們希望傳入$a,$b兩個參數 ,如果$a大於$b,返回兩數之差,否則返回兩數只和,同時我們還希望知道結果求和還是求差,當然這個需求本來就有點說不通,暫時不提這個,因爲php只能return一個結果,有童鞋可能會想到將結果和運算方式寫入數組返回,但也可以通過如下方式:
function test($a,$b,&$result){
if($a > $b){
$result = "sub";
return $a-$b;
}else{
$result = "add";
return $a+$b;
}
}
通過傳入第三個變量$result來獲得運算方式,我們知道,參數在傳遞進函數中並且運算完畢這個過程不會經過改變的,如果要使參數發生改變,除了通過globel關鍵字聲明,還可以通過&符來完成
$num = test(1, 2, $result);
有興趣的同學可以分別打印下$num跟$result;
運算符篇
&(按位與)符作爲一種位運算符,我們也可以使用&來簡化一些功能實現,比如:權限
一般我們設計權限時都會設計基於rbac的權限關係表,並存儲到數據庫中,關於rbac在此不多說,不懂的童鞋可以自行百度,但對於一個小型系統來說,生產環境中經常出現一個用戶同時可能需要有多個角色的操作權限的情況,如果權限不是很多,巧妙使用&符號即可以解決這個問題,而且省去複雜的rbac關係
先看一組數字 1,2,4,8,16,32,64,128,512,1024,細心的童鞋可能一眼就看出來了規律,沒錯,就是2的次方那我們如何來完成一個權限呢
我們可以先這樣定一個一個數組
[
'select'=>1,
'update'=>2,
'add'=>4,
'delete'=>8
]
在分配權限時,我們盡需要保存所分配權限的和,比如用戶有修改和添加權限 那麼權限和爲6
判斷權限時,使用&符號判斷即可,比如,查詢的權限爲1,那麼我們判斷是否有查詢權限時,即用所需權限按位與(&)總權限,對應上述即爲 1&6 = false,而修改權限爲 2&6 = true,具體運算過程在這不多說,是不是很方便呢,對於一個權限不是很多的小型系統,這樣是不是很方便呢?