&:按位与。以$a & $b为例,将$a和$b转化为二进制后,都为1的位设为1。
$a=6;
$b=3;
var_dump($a & $b);
输出int(2)
原理:
应用:
需求:这是一个设置消息提醒的功能。我们假设这是一个blog系统,用户希望有人收藏自己的文章后,可以得到一个消息提醒。这里有三种提醒方式:邮箱提醒、短信提醒、微信公众号提醒,用户可以通过开关按钮控制某种提醒方式是开启还是关闭。可以参考以下表格:
提醒操作 | 邮箱 | 短信 | 微信公众号 |
---|---|---|---|
文章被收藏 | 开关按钮 | 开关按钮 | 开关按钮 |
被关注 | 开关按钮 | 开关按钮 | 开关按钮 |
有人评论 | 开关按钮 | 开关按钮 | 开关按钮 |
实现:
1、数据库设计,表名remind。
字段 | 数据类型 | 默认值 |
---|---|---|
collection(文章被收藏) | int | default(0) |
followed(被关注) | int | default(0) |
commented(有人评论) | int | default(0) |
2、在Remind Model中设置执行操作的提醒方式类型:
cosnt REMIND_NO=0;//关闭所有的提醒 cosnt REMIND_EMAIL=1;//邮箱提醒, 2的0次方(任何数的0次方都等于1), 1转换为二进制是1。 cosnt REMIND_SMS=2;//短信提醒, 2的1次方, 2转换为二进制是10。 cosnt REMIND_WECHAT=4;//微信公众号提醒, 2的2次方, 4转换为二进制是100。
如果有新的提醒方式值应为8、16、32以此类推(2的n次方)。
仔细观察二进制转化后:
假设用户希望有人评论他的文章时,收到来自系统的提醒:
3、控制器中写具体业务逻辑:
用户希望有人关注他后,可以通过邮箱提醒他,所以用户开启了邮箱提醒:
后来用户觉得短信提醒比较直接,所以又开启了短信提醒:
后来该用户越来越厉害,每天关注他的人特别多,每天都收到很多消息,所以他想关闭短信提醒:
$option=$_GET['option'];//提醒操作,由前端传来的值 $type=$_GET['type'];//提醒方式,由前端传来的值 $remind=Remind::model()->find(1);//根据条件,在数据库中找到的一条记录 if($type=='sms'){ if($remind->$option & Remind::REMIND_SMS) { //true代表已开启sms提醒,此时应关闭sms提醒 $remind->$option -= Remind::REMIND_SMS; } elseif(!($remind->$option & Remind::REMIND_SMS)) { //false代表已关闭sms提醒,此时应开启sms提醒 $remind->$option += Remind::REMIND_SMS; } }