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,具体运算过程在这不多说,是不是很方便呢,对于一个权限不是很多的小型系统,这样是不是很方便呢?