1,什么是开关状态
现实中,有很多数据都是只有两种结果(值)的,对应的其实就是我们的布尔类型的值。
这里,所谓的管理一组事务的开关状态,应该理解为其实就是管理若干个只有2个状态的“数据符号”。
比如:有5个灯泡,对应5个状态数据。这5个灯泡,就有25 种状态呢
这里的管理目标是:使用一个变量,就可以表达若干个数据的“当前状态”。具体有3个任务:
1、通过该变量,可以获知任何一个数据(灯泡)的当前状态。
2、通过该变量,可以将一个一个数据的状态“关闭”;
3、通过该变量,可以将一个一个数据的状态“开启”;
<?php //假设,有5个灯泡需要管理,需要实现以下的功能目标 //1,可以指定任意一个灯泡的“当前状态” //2,可以打开指定的任意一个灯泡 //首先,需要设定对应的5个常量,代表对应的5个灯泡 define("D1" ,1); //对应的二进制值为:00000001 define("D2" ,2); //对应的二进制值为:00000010 define("D3" ,4); //对应的二进制值为:00000100 define("D4" ,8); //对应的二进制值为:00001000 define("D5" ,16); //对应的二进制值为:00010000 //更多的灯,也按此规律定义常量值!!! //然后,定义一个变量,该变量就代表这5个灯泡的“任意组合状态”值; $state = 10; //其对应的为二进制值为:00001010 //此时,它其实也表示第2个和第4个灯凉 //$state =7; //其对应的为二进制值为:00000111 //$state =71; //其对应的为二进制值为:00010001 //注意:以上3个赋值,只是表示$state的值可以是“任意的” //任务1,可以指定任意一个灯泡的“当前状态” //需求1a:请输入灯泡1的状态 //按此算法逻辑就可以判断灯1 //分析: //$state的值为:00001010 //D1的值为 :00000001 // & //------------------------ // 00000000 if(($state & D1) >0){ echo "<br />灯1是亮的"; }else { echo "<br />灯1是灭的"; } //需求1b:请输入灯泡2的状态; if(($state & D2) >0){ echo "<br />灯2是亮的"; }else { echo "<br />灯2是灭的"; } //写出方法,展示所有灯的整体显示 function ShowAll() { echo "<p>"; for($i=1;$i<=5;++$i) { $s = "D".$i; if(($GLOBALS['state'] & constant($s)) > 0) { echo "灯{$i}是亮的<br />"; }else { echo "灯{$i}是灭的<br />"; } } echo "</p>"; } echo "<br />初始多有灯的状态:"; ShowAll(); //需求2,可以打开指定的任意一个灯泡 //也只要按照如下算法就可以打开: //$state = $state |对应灯的常量值: //需求2a:请打开灯3 $state = $state | D3; echo "<br />灯3打开后:"; ShowAll(); //需求2b:请打开灯5: $state = $state | D5; echo "<br />灯5打开后:"; ShowAll(); //需求3,可以关闭指定的任意一个灯泡 //也只要按照如下算法就可以打开: //$state = $state & (~对应灯的常量值): //需求3a:请关闭灯2 $state = $state & (~D3); echo "<br />灯3关闭后:"; ShowAll(); //需求3b:请关闭灯5 $state = $state & (~D5); echo "<br />灯5关闭后:"; ShowAll(); //需求3c:请关闭灯1(其实该登本来就是关闭的) $state = $state & (~D1); echo "<br />灯1关闭后:"; ShowAll();