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);

"="的运算优先级低于"||"        布尔值的自增和自减是不起作用的           牵扯到多个运算符时要合理规范的利用"()"