1.变量类型
整型【interge】,浮点型【double】(在PHP中,float和double都是指浮点型),字符串【string】,布尔【boolean】(值是true和false),数组【array】,对象【object】,NULL【没有值也没有类型】,资源【resource】
2.变量检测
isset() 检测变量是否设置 例如 isset($b)
1 if(isset($b)){
2 echo '变量b存在';
3 }else{
4 echo '变量b不存在';
5 }
注:若使用isset()测试一个被设置为NULL的变量,将返回FALSE,也即会返回你所测试的变量不存在。同时,还要注意一个NULL字节(“\0”)并不等同于PHP的NULL常数。还有,若是你所测试的变量c是这样的 $c=''; 或 $c=0; 那么,变量c是存在的。
3.变量类型检测
gettype() 获取变量类型
echo gettype($a);
判断是否是某一类型:
- is_array() 检测是否是数组
- is_bool() 检测是否是布尔型
- is_int() 检测是否是整型
- is_interge() 检测是否是整型
- is_long() 检测是否是整型
- is_float() 检测是否是浮点型
- is_object() 检测是否是对象
- is_string() 检测是否为字符串
1 if(is_int($a)){
2 echo 'a是整型';
3 }else{
4 echo 'a不是整型';
5 }
注:若想测试一个变量是否是数字或数字字符串(如表单输入,它们通常为字符串),必须使用 is_numeric()。
4.打印调试变量
- echo() 【适合打印字符串和数字】
- print_r() 【适合打印数组】
- var_dump() 【都适合,因为它是打印变量的类型及其值】
5.变量类型转换
PHP中,变量的类型是可以随时转变的,非常灵活
最常见的是字符串与数字的转换,或是数字/字符串向布尔值的转换
1>字符串到数字的转换,从左到右截取,直至遇上不合法的部分,结出来的部分转成数字
1 echo '<br />';
2 $a = '12.5hello99';
3 $a = $a + 3;
4 var_dump($a);
运行结果为: float(15.5)
2>数字到字符串的转换
1 $a = 123;
2 $a = $a . 'hello';
3 echo $a;
运行结果:123hello
3>到布尔型的判断,以下之都被当作布尔值的假,而其他值,都被当做布尔值的真
'','0',0,0.0,NULL,FALSE,array(),var$var
6.传值赋值与引用赋值
1>传值赋值
1 $li = 29;
2 $wang = 23;
3 $wang = $li;
4
5 var_dump($li,$wang);
结果都是29,并且在此之后无论谁单独改变赋值都不会影响到另一个。
2>引用赋值
1 $li = 29;
2 $wang = 23;
3
4 $wang = &$li;
结果都是29,但是此时$wang指向了$li的地址,也就是说,他们此时的地址都是$li的地址,在此之后对他们中任意一个改变赋值也会影响到另一个。
7.销毁变量
unset()
若$li和$wang共同指向一个地址,此时销毁他们中的其中一个,另一个不会受到影响。
8.动态变量名
用变量的值作变量的名,如:$$a;
1 $liubei = '河北';
2 $laoda = 'liubei';
3 $paihang = 'laoda';
4 echo $laoda , $$laoda ,$$$paihang;
结果是 liubei 河北 河北
9.算术运算符
注意事项:
1>运算中的除数不能为0,当有 $a / $b 时,$b不能为零。
2>在PHP中,int型的数是有上限的,当你指定的数字过于大时,系统会自动将其转换为float浮点型。
比如:
1 $a = 3200000000;
2 $b = 3200000000;
3 $c = $a + $b;
4 var_dump($c);
结果是: float(6400000000)
4>取模运算中,结果的正负仅取决于被除数的正负,与除数无关。
1 $a = -10;
2 $b = -3;
3 echo $a % $b;//取模算法时,结果的正负仅取决于被除数也即$a
结果为 -1
10.比较运算符
比较运算的结果时布尔型值
1 $a = 5;
2 $b = 3;
3 $c = ($a > $b);
4 var_dump($c);
结果是 bool(true)
- 等于 == 只要求比较双方值相等结果就为true
- 全等于 === 要求比较双方类型和值都相等结果才为true
11.三元运算符
($a>=$b?$a:$b); 含义就是判断$a和$b的大小,若$a>=$b为真,则输出$a,为假则输出$b。
12.逻辑运算符
与 ($a == true)&&($b == true) 只有$a和$b都是true时 该运算结果才为true。
或 ($a || $b) 只要$a,$b其中一个为true结果就是true。
13.递增递减运算符
1>递增运算
1 $b = 5;
2 $a = $b++;//先把$b的值赋给$a再对$b进行++
3 var_dump($a,$b);
结果是 int(5) int(6)
1 $b = 5;
2 $a = ++$b;//先对$b进行++再把值赋给$a
3 var_dump($a,$b);
结果是 int(6) int(6)
2>递减运算
方式与递增同理
14.字符串运算符
$a . $b 将$a,$b拼接在一起 (若运算对象是整型数字,也会把它当作字符串来拼接)
1 $a = 'hello';
2 $b = 'world';
3 $c = $a . $b;
4 var_dump($c);
结果是 string(10)"helloworld"
注:若仅仅是将字符串对象打印出来,那么echo $a , $b; 语句的运行速度要比 echo $a . $b; 语句的运算速度更快。
15.赋值运算符
$a = 3;// 这是一个赋值运算,有两个作用,一是把3赋给$a,二是返回运算结果,即3
16.switch case 控制结构
1 $today = 1;
2 if($today == 1){
3 echo '今天星期一';
4 } else if($today == 2){
5 echo '今天星期二';
6 } else if($today == 3){
7 echo '今天星期三';
8 } else if($today == 4){
9 echo '今天星期四';
10 } else if($today == 5){
11 echo '今天星期五';
12 } else if($today == 6){
13 echo '今天星期六';
14 } else if($today == 7){
15 echo '今天星期日';
16 } else {
17 echo '不存在这种星期!';
18 }
显然输出结果是 今天星期一
我们可以用以下switch case语句来替换上述语句
1 $today = 1;
2 switch ($today){
3 case 1:
4 echo '今天星期一';
5 break;
6
7 case 2:
8 echo '今天星期二';
9 break;
10
11 case 3:
12 echo '今天星期三';
13 break;
14
15 case 4:
16 echo '今天星期四';
17 break;
18
19 case 5:
20 echo '今天星期五';
21 break;
22
23 case 6:
24 echo '今天星期六';
25 break;
26
27 case 7:
28 echo '今天星期日';
29 break;
30
31 default:
32 echo'不存在这种星期!';
注:switch case 适合用在验证多个可能值时使用,不适合用在判断范围上。
17.while循环和do-while循环
1>while循环
1 $i = 100; //初始化某一值
2 while($i<=10){ //先进行条件判断
3 echo $i++,'<br/>'; //若条件满足则执行该语句('<br/>'这是换行的意思)
4 }
2>do-while循环
1 $i = 100; //初始化某一值
2 do{
3 echo '我照样执行'; //先执行一遍语句
4 }while($i<10); //再进行条件判断,若条件满足则再次执行语句
18.for循环
循环的一般要素:初始化,判断,执行体,修改变量
for(初始化;判断;修改变量){
执行体
}
19.break与continue
1>break
1 for($i=0; $i < 10; $i++){
2 if($i == 7){
3 echo $i,'找到了<br />';
4 break;
5 } else {
6 echo $i, '<br />';
7 }
8 }
输出结果从0到7没有8,9。
2>continue
1 for($i=0; $i <10 ; $i++){
2 if($i == 4){
3 continue;
4 }
5 echo $i, '<br />';
6 }
输出结果从0到9但是没有4。
20.经典案例之过桥问题
假设某人有100000现金,每经过一次路口需要进行一次缴费。缴费规则为当他现金大于50000时每次需要交5%,如果现金小于等于50000时每次交5000,请写一程序计算此人可以经过多少次这个路口。
1 for($i=100000,$cnt=0;$i>=5000;){
2 $cnt +=1;
3 if($i>50000){
4 $i *=0.95;
5 }else{
6 $i -=5000;
7 }
8 echo '第' ,$cnt , '次过桥,剩下',$i , '元<br/>';
9 }
21.经典案例之打印九九乘法表
1 for($=1 ; $i <= 9 ; $i++){
2 for($j = 1 ; $j <= $i ; $j++){
3 echo $j , '*' , $i , '=', $j*$i, ' ';
4 }
5 echo '<br/>';
6 }
22.经典案例之百钱买百鸡
公鸡5文钱一只,母鸡3文钱一只,小鸡1文钱三只,现有100文钱共买了100只鸡,问,100只鸡中,公鸡,母鸡,小鸡各多少只?
1 for($g = 1; $g <= 100; $g ++){
2 for($m = 1; $ m <= 100; $m ++){
3 $x = 100 - $g - $m;
4 if(($g+$m+$x == 100)&&($g*5 + $m*3 + $x/3) == 100){
5 echo '公 母 雏 各', $g, ' ', $m, ' ', $x, '<br/>';
6 }
7 }
8 }
23.函数概念
一段封装好的代码,可以随时调用。
1 function t1(){
2 echo 'hello';
3 echo 'world';
4 echo '!<br/>';
5 }
6
7 t1();//调用函数
1 function he($a,$b){
2 $c = $a + $b;
3 echo $c;
4 }
5
6 he(3,4);//调用函数
24.函数的定义格式
function 函数名([参数1,参数2...]){
//执行语句
//return
}
[ ]内的代表可有可无。
命名规范:对于函数,命名规则和变量是一样的,但是函数不区分大小写。
25.函数的调用过程与返回值
函数调用时,代码执行权进入函数,当函数所有语句执行完毕,函数结束,交回执行权,或者函数碰到return语句时,函数返回,交回执行权。
1 function t2(){
2 echo '1';
3 echo '2';
4 echo '3';
5 return 'good';
6 echo '4';
7 echo '5';
8 return 'study';
9 }
10
11 $res = t2();// 打印结果是123
12
13 echo $res;//打印结果是good
对于返回值,可以没有明确的返回值,但的确要有返回值时,只能有一个返回值。
26.函数参数的传值方式
1 function t($a){
2 $a +=1;
3 }
4 $a=3;
5 t($a);
6 echo $a, '<br/>';
此时的打印结果是3,因为函数中的$a和函数外的$a不是同一个参数。
1 function t2(&$a){
2 $a +=1;
3 }
4 $b = 5;
5 t2($b);
6 echo $b;
此时的打印结果是6,因为函数采用了引用传值,导致$a和$b指向了同一个地址。
注:这种传参方式是不推荐的,因为函数内部的语句因此能够影响外部的变量,破坏了函数的封装性。
27.函数中变量的作用域
在PHP的页面中声明的变量,叫“全局变量”,函数内的变量,叫“局部变量”。
全局变量可以用global()来声明,即使是在函数内通过global()声明的参数也同样是全局变量,但是不推荐这样做,因为会破坏函数的封装性。
超级全局变量,在页面的任何部分,包括函数,方法等,都可以直接访问。
28.动态调用函数
可以用某变量的值当作函数,并调用函数。
1 function wel(){
2 echo 'welcome';
3 }
4 function beat(){
5 echo 'beat';
6 }
7 $heart = 'wel';
8 $heart();//$heart的值是wel,因此可以调用执行wel()函数。
29.时间戳函数
时间戳是指自1970-01-01 00:00:00到现在这一瞬间经过的秒数。
- time() //echo time(); 返回时间戳,精确到秒数
- microtime() //print_r(microtime()); 或者 print_r(microtime(true)); 返回时间戳,精确到微秒
可以用来测试程序的运行效率,比如:
1 $start = microtime(true);
2 for($i=1; $i<10000; $i++){
3 $tmp = 13333/234;
4 }
5 $end = microtime(true);
6 echo $end - $start;
30.时间戳格式化
- date()
- gmdate() //与date()相比差异在与gmdate()不考虑时区的差异,均采用格林威治时间。
1 $time = time();
2 echo date("Y-m-d 星期N h:i:s' , $time);//参数$time可有可无,没有的话就是代表打印当前时刻的时间。
//若是把参数$time改成0,那么结果将是 1970-01-01 星期4 08:00:00 差八小时是时差的原因
运行结果就是今天的年月日星期几和具体时间,比如 2021-11-28 星期0 03:20:32 (星期0就是星期日)
31.解析检测日期
- mktime() //echo mktime(15,42,31,11,28,2021); 就是打印出2021年11月28日15时42分31秒的时间戳
- strtotime() //echo strtotime('now + 1 day'); 就是打印出明天此时的时间戳
- checkdate() //var_dump(checkdate(2,29,2000)); 结果就是bool(true) 就是检测日期是否合法
32.字符串定义方式
- 单引号或双引号定义小段字符
1 $str1 = 'hello';
2 $str2 = "hello";
- heredoc nowdoc 定义大段文本
heredoc
1 $str3 = <<<HTML //HTML不是必须的,它是个人定义的,但是得大写。
2 hello
3 world
4 balabala;
5 HTML;
6
7 echo $str;
nowdoc
1 $str4 = <<<'INTRO'
2 远看山有色,
3 近听水无声。
4 INTRO;
5
6 echo $str4;
33.单双引号区别
heredoc和nowdoc的区别也是如此。
- 转义:
1 $str1 =' \' \\ \n \t \v \$'; //转义 \' \\
2 echo $str1;
输出结果是 ' \ \n \t \v \$
1 $str2 =" \" \\ \n \t \v \$"; // 转义 \" \\ 而\n,\t, \v都有各自的特殊含义在,不会被打印出来而是执行它们各自的操作,其中\n是换行,\t是水平制表,\v是垂直制表
2 echo $str2;
输出结果是 " \
$
- 变量解析:
双引号里的变量能解析
1 $age = 29;
2 $str3 = '李明今年 $age 岁';
3 $str4 = "李明今年 $age 岁";
4 echo $str3,'<br/>';
5 echo $str4,'<br/>';
输出结果是 李明今年 $age 岁
李明今年 29 岁
- 速度:
单引号不需要分析串内有没有变量,需要转义的内容也少,速度比双引号要快,故一般优先选用单引号。
34.字符串常用函数
1>字符长度函数
strlen() 算的是字符串的字节数,若是碰到汉字,要知道在utf8编码中一个汉字占三个字节。
mb_strlen() 算的是字符数量,但使用时也要明确好所要计算的字符的编码类型
1 $str1 = 'hello';
2 echo strlen($str1), '<br/>';//结果是5
3
4 $str2 = '中国';
5 echo strlen($str2), '<br/>';//结果是6
echo mb_strlen($str2,'utf-8'),'<br/>';//结果是2
2>查找字符位置函数
strpos()
1 $str = 'abcde';
2 $char = 'c';
3
4 if(strpos($str,$char) !=== false){
5 echo '含有',$char,'<br/>';
6 }else{
7 echo '没有',$char,'<br/>';
8 }
3>字符串替换函数
str_replace() 替换单个字符串
1 $str = 'hi, fuck';
2 echo str_replace('fuck','f**k',$str),'<br/>';
strstr() 替换一批字符串
1 $str = '男人,女人,男孩,女孩';//将字符串中的‘男’和‘女’互换
2 echo strstr($str, array('男'=>'女' , '女'=>'男')); //输出结果就是 女人,男人,女孩,男孩
4>提取子字符函数(双字节)
substr()
1 $str = 'tommrow is another day';
2 echo substr($str , 0 , 3);//从第0位开始截3个字节, 结果就是 tom
若第三个参数是负数,代表结束位置,从后往前数 比如,echo substr($str, 3, -3); 结果就是mrow is another
若第二个和第三个参数都是负数 比如,echo substr($str, -10, -3); 结果就是nother
5>分割,连接,反转函数
拆分字符串:explode()
连接字符串:implode()
1 $str = 'tech,linux,mysql';
2 $arr = (explode(',',$str));
print_r($arr);//结果就是 Array([0]=>tech [1]=>linux [2]=>mysql)
echo implode($arr,',');//结果就是 tech,linux,mysql
6>去除,增加空格函数
7>HTML代码/数据库安全处理有关函数
8>比较字符函数
9>字符大小写转换函数
35.数组声明方式
数组是一种复合数据,可以装下多个值,每个值用不同的键来区分。
$arr = array('001'=>'春','002'=>'夏','003'=>'秋','004'=>'冬');
36.数组类型
- 索引数组
$arr = array('001'=>'春','002'=>'夏','003'=>'秋','004'=>'冬'); // 键不必有特殊意义,纯数字。
- 关联数组
$arr = array('name'=>'小华','age'=>'20'); //字符串做键,一般能体现该单元的内容,如age->年龄。
- 多维数组
$arr = array(0=>'a' , 1=>array('stu'=>'li','bag'=>array('yuwen','shuxue'))); //数组内又有数组。
37.数组键的规则
- 若是不声明键,那么将会自动从0,1,2....递增来生成键。
- 若是已经存在某一个或几个数字键,那么将会从最大的数字键开始,递增生成数字键。
- 若是键声明的重复了,那么对于重复的值,后面的值将会覆盖前面的。
- 键可以是整数,也可以是字符串。
- 键若是浮点数,将会把它转换成整数。
- 若字符串的内容恰好是整数,也将其理解为整数。
38.操作数组单元
- 增一个单元:
1 $arr = array('a','b','c');
2
3 $arr[] = 'd'; //自动给值'd'分配键为3,添加进数组
4 $arr[99] = 'e'; //作为键为99,值为'e',添加进数组
5
6 print_r($arr);
- 读取单元值
一般数组: echo $arr[3];
多维数组: echo $arr['stu'][1]; //'stu'是 通过$arr['stu'] = array('li','wang'); 添加到数组 $arr = array('a','b','c')当中的。 更多维的数组只需在后继续加[ ]表示就行了。
- 修改单元值
$arr[0] = 'A'; // 就是重新赋值,这样操作过后原本的'a'就变成'A'了
- 删除某单元
unset($arr[1]); // 删除键为1的单元
39.遍历数组
for循环,用于0,1,2.....递增的索引数组。
1 $arr = array('a','b','c','d','e','f');
2 for($key = 0; $key < count($arr); $key++){ //count($arr)是用来数该数组的元素个数的
3 echo $arr[$key],'<br/>';
4 }
foreach() 用于关联数组
1 $arr = array('age'=>28,'height'=>180,'name'=>'lisi');
2
3 foreach ($arr as $key => $value){
4 echo $key , '~' , $value , '<br/>';
5 }
//若是只想将值取出,而不取键,可以这样做
foreach($arr as $value){
echo $value,'<br/>';
}
40.数组游标操作
$arr = array('a','b','c','d','e');
- current($arr) // 取当前游标指向的数组单元的值
- next($arr) //把当前数组的游标往后移一位
- prev($arr) //把当前游标往前移一位
- end($arr) //把数组的游标移到最后
- reset($arr) //将游标进行复位,即将游标返回最前面
41.数组常用函数
- count($arr); //用来数数组当中的元素个数
- array_key_exists('c', $arr); // 判断数组$arr当中是否存在键为'c'的元素
- in_array('张华', $arr); //判断数组$arr中是否存在值为'张华'的元素
- array_push($arr, 'e'); //往数组尾部加入单元,并返回操作后的数组长度
- array_pop($arr); //将数组尾部的单元弹出
- array_unshift($arr, 'z'); //往数组的头部加入单元
- array_shift($arr); //弹出头部单元
- ... ...
42.数组案例之小羊繁殖
有一种羊,在第二年生一只小羊,第四年生一只小羊,第五年死亡。问,20年后有多少只羊?
1 $arr = array(1,0,0,0,0);
2 for($i = 1;$i <= 20;$i++){
3 $tmp = $arr[1] + $arr[3];
4 array_unshift($arr, $tmp);
5 array_pop($arr);
6 }
7
8 echo array_sum($arr);
43.超级全局变量
$_GET //地址栏上获得的值
$_POST //POST表单发送的数据
$_REQUEST //既有GET,也有POST的内容
$_SESSION
$_COOKIE
$_FILES
$_ENV //服务器操作系统的环境变量,如操作系统类型 容易暴露服务器信息,一般不允许显示。
$_SERVER //获取当前服务器的域名,以及当前访问的脚本,来访者IP
$GLOBALS //是对全局变量花名册的一个别名,因此通过该变量可以任意访问全局变量
//若是禁用了$_ENV变量,还可以通过 phpinfo(); 来获取环境信息。
除此外再介绍一些其它一些可以用于获取用户信息:
获取系统类型及版本号: php_uname() (例:Windows NT COMPUTER 5.1 build 2600)
只获取系统类型: php_uname('s') (或:PHP_OS,例:Windows NT)
只获取系统版本号: php_uname('r') (例:5.1)
获取PHP运行方式: php_sapi_name() (PHP run mode:apache2handler)
获取前进程用户名: Get_Current_User()
获取PHP版本: PHP_VERSION
获取Zend版本: Zend_Version()
获取PHP安装路径: DEFAULT_INCLUDE_PATH
获取当前文件绝对路径: __FILE__
获取Http请求中Host值: $_SERVER["HTTP_HOST"] (返回值为域名或IP)
获取服务器IP: GetHostByName($_SERVER['SERVER_NAME'])
接受请求的服务器IP: $_SERVER["SERVER_ADDR"] (有时候获取不到,推荐用:GetHostByName($_SERVER['SERVER_NAME']))
获取客户端IP: $_SERVER['REMOTE_ADDR']
获取服务器解译引擎: $_SERVER['SERVER_SOFTWARE']
获取服务器CPU数量: $_SERVER['PROCESSOR_IDENTIFIER']
获取服务器系统目录: $_SERVER['SystemRoot']
获取服务器域名: $_SERVER['SERVER_NAME'] (建议使用:$_SERVER["HTTP_HOST"])
获取用户域名: $_SERVER['USERDOMAIN']
获取服务器语言: $_SERVER['HTTP_ACCEPT_LANGUAGE']
获取服务器Web端口: $_SERVER['SERVER_PORT']
访问用户的浏览器信息: $_SERVER['HTTP_USER_AGENT'];
<script language="JavaScript">
document.write("浏览器名称: "+navigator.appName+"<br>");
document.write("浏览器版本号: "+navigator.appVersion+"<br>");
document.write("系统语言: "+navigator.systemLanguage+"<br>");
document.write("系统平台: "+navigator.platform+"<br>");
document.write("浏览器是否支持cookie: "+navigator.cookieEnabled+"<br>");
44.常量
意义:声明后,值不能修改。
声明:define() //例如,define('PI',3.14); echo PI ; 常量名前不加$
命名规范:和变量一样,只是习惯上全是大写。
特点:声明后值不能修改,不能重新声明,也不能销毁。 常量在声明后,该常量在页面的任意处都可以访问。
检测常量:defined() //例如,defined('PI');
但真实开发当中,一般这样做:
1 if(!defined('HEI')){
2 defiend('HEI',8846);
3 }
4 echo HEI;
动态常量名:用变量的值作常量的名字 例如,
1 $chang = 'HEI';
2 echo $chang, '<br/>';//打印 HEI
3
4 echo constant('HEI'),'<br/>'; //打印 8846
5 echo constant($chang),'<br/>';//打印 8846
45.文件包含
- include 引用效果可以叠加,每引用一次,所引用文件中的语句就会执行一次
- include_once 引用效果不会叠加,即使多次引用某一文件,该文件内容也只会执行一次
- require
- require_once
若引入文件不存在,include会显示warning错误,但仍会尽量向下继续执行,但是require则是直接报fatal error错误,而且脚本立即停止执行。
注:不加_once的执行速度会更快些。
文件包含的作用在于代码的重用,我们可以把常用的代码段写进一个文件中,当我们需要这些代码的时候,引入这个文件就好了。
例如,我们在25-sub.php当中定义如下代码:
1 function t(){
2 echo 'hello';
3 }
4 $age = 20;
那么我们就可以在另一个页面当中这样引用他们:
1 include('./25-sub.php');//相当于把25-sub.php的文件内容替换本行
2 t();//打印 hello
3 echo $age;//打印 20
46.进制与位运算
进制:
生活中常用10进制,计算机中常用2进制,8进制和16进制。
10进制,就写成日常生活中的数字的样子 echo 123;,从右往左三个位,分别是以1顶1,以1顶10,以1顶100
8进制,在数字前加0代表8进制 echo 0123;从右往左三个位,分别是以1顶1,以1顶8,以1顶64
16进制,在数字前加0x代表16进制 echo 0x123;从右往左三个位,分别是以1顶1,以1顶16,以1顶256
2进制,PHP目前不支持直接表示 10进制的5,2进制写成0000 0101
10进制的255,2进制写成1111 1111
10进制的-1,2进制写成1111 11111
上面的8个1,到底理解成255还是理解成-1,取决于程序,比如在MySQL中,int理解为-1,unsigned int理解为255.
位运算:
是针对字节上的位来进行运算,把位的0/1当成假/真,针对每个位上的逻辑运算,就是位运算。
例如:
10进制 2进制
5 0000 0101
12 0000 1100
& ----------------------------- //与运算
0000 0100
| ----------------------------- //或运算
0000 1101
^ ----------------------------- //异或运算
0000 1001
所以,echo 5 & 12 , '<br/'; 的结果是4
echo 5 | 12 , '<br/>'; 的结果是13
echo 5 ^ 12 , '<br/>'; 的结果是9
echo ~ 5 , '<br/>'; 的结果是-6 这是取反运算,对十进制5取反在计算机中转变为对二进制0000 0101取反得到1111 1010
利用位运算的左移,使整数增大两倍
$a = 3;
echo $a << 1; //结果是6
利用位运算右移,对数进行处理
$a = 3;
echo $a >> 1; //结果为1
echo 8 >> 2; //结果为2
47.位运算与PHP错误报告设置
PHP脚本的错误,分多个等级,如致命错误,Notice,warning,N多级
PHP把不同等级的错误报告用数字来表示,比如
1 E_ERROR 致命的运行错误,这类错误一般是不可恢复的情况,后果是导致脚本终止运行。
2 E_WARNING 运行时警告(非致命错误),仅给出提示信息,但是脚本不会终止运行。
4
8
16
... ...
30719 E_ALL 打印所有的错误和警告信息。
设置错误报告:
error_reporting(E_ALL); //报告所有的错误和警告信息
error_reporting(0); //不进行任何错误报告
error_reporting(E_ALL ^ E_NOTICE); error_reporting(E_ALL & ~E_NOTICE); //这两个均表示报出除了notice之外的所有错误
48.浮点数不精确
1 if((0.3 - 0.2) == 0.1){
2 echo '相等';
3 }else{
4 echo '不相等';
5 } //运行结果为 不相等
10进制: 3.1,是 3*10^0 + 1* 10^-1
3进制: 1.1, 是 1*3^0 + 1* 3^-1 //对应10进制的1.33333……3333333…………
10进制 2进制
0.5 0.1
0.8 0.11000……
某些小数在10进制下是有限的,转成2进制可能会无限循环,因此,会损失和一些精度,导致浮点数计算和数学上结果不一样。
49.逻辑运算的短路特性与运算符优先级
1 $house = false;
2 $car = true;
3 if($house && $car){
4 echo '嫁';
5 }else{
6 echo '不嫁';
7 } //结果为 不嫁 因为房子的值已经为假,又用并且计算,结果为假,程序并不会去判断$car的值
8
9 $b = 1;
10 if($house && ($b = 6)){
11 }
12 echo $b , '<br/>'; //结果为1,$b = 6 被短路,没机会执行
13
14 if($house || ($b = 6)){
15 }
16 echo $b , '<br/>'; //结果为6
17
18 if($car || ($b = 6)){
19 }
20 echo $b , '<br/>'; //结果为1, $car的值为真,或运算结果为真,$b = 6 会被短路,不予执行
利用短路特性写出简短的判断代码
1 if(!defined('PI')){
2 defined('PI',3.14);
3 }
4
5 就相当于
6 defined('PI')||defined('PI',3.14);
"="的运算优先级低于"||" 布尔值的自增和自减是不起作用的 牵扯到多个运算符时要合理规范的利用"()"