PHP语法基础

变量

- 变量名字必须以$开头
- 删除变量 :	unset($var);

预定义变量

预定义变量:提前定义的变量,系统定义的变量(预定义变量都是数组)

变量名
$_GET 获取以get方式提交的数据
$_POST 获取以post方式提交的数据
$_REQUEST 获取以get,post方式提交的数据
$GLOBALS PHP中的所有全局变量
$_SERVER 服务器信息
$_SESSION session会话数据
$_COOKIE cookie会话数据
$_ENV 环境信息
$_FILES 用户上传的文件信息

可变变量

可变变量:就是一个变量的变量名可以动态的设置和使用。

<?php
    	$a = 'b';
        $b = 'aa';
        echo $$a;	// 等价于 、$($a) ==> $b = aa	===>输出 aa	
		
		$a = &$b 		//引用传递
?>

静态变量

用static修饰的变量,是在函数内部定义的变量

  • 系统会在编译时为静态变量开辟空间(函数调用前)赋值,
  • 函数调用时会自动跳过静态static修饰语句

常量

  • 常量名不需要使用$,字母全大写。
  • define(‘’常量名“,常量值)
  • const 常量名 = 常量值
  • constant(“常量名”)
    <?php
        const PI = 3.1415926;   //const关键字定义常量
        define('PII',3.1415926); // define函数定义常量,可以定义包含特殊符号的常量名	const不行
        echo PII ,"<br>", PI , "<br>";	//该发式不能访问特殊符号的常量 需要使用constant函数
  		define("~_~","沉默");	
  		echo constant("~_~");	//访问常数的函数	
  ?>

系统常量

系统常量名
PHP_VERSION php的版本
PHP_INT_SIZE 整型所占用的字节数
PHP_INT_MAX 整型的最大值
PHP_INT_MIN 整型的最小值
...

魔术常量

魔术常量名
__DIR__ 当前被执行的脚本所在电脑中的绝对路径
__FILE__ 当前被执行的脚本所在电脑中的绝对路径(包括文件名)
__LINE__ 当前所属的行数
__NAMESPACE__ 当前所属的命名空间
__CLASS__ 当前所属的类
__METHOD__ 当前所属的方法
...
<?php
      echo __DIR__      , "<br>";		//F:\桌面\php02
      echo __FILE__     , "<br>";		//F:\桌面\php02\text.php
      echo __LINE__     , "<br>";		//30
      // echo __NAMESPACE__, "<br>";
      // echo __CLASS__    , "<br>";
      // echo __METHOD__   , "<br>";
?>

数据类型

在PHP中将数据分为三大类,八小类

  • 简单(基本)数据类型 : 4 小类

    • int :系统分配4个字节存储
    • flaot/double : 系统分配8个字节存储
    • string : 视情况而定
    • bool/Boolean
  • 复合数据类型 : 2个小类

    • object
    • array
  • 特殊数据类型: 2小类

    • resource : 存放资源数据(数据库资源等)
    • NULL

数据类型转换

  1. 自动转换
  2. 强制转换
<?PHP
      $a = '12a99' ;
      $b ='a12';
      $c = '2.5';
      echo  $c + $a ,'<br>';           // 自动转换  14.5   
      echo (int)$a ,"<br>";         //强制转换  12
      echo (int)$b ,"<br>";         //强制转换  0   
?>

类型判断

  • is_xxx(变量名) 判断数据类型
  • Gettype(变量名) 获取类型
  • Settype(变量名 ,‘类型’) 设置数据类型 ,设置成功返回true , 失败返回false
<?php
      $a = 12.9;
      $b = '12.9';
      $c = (double)12.9;

      var_dump( is_float($a)  )  ; echo "<br>" ;		// bool(true)
      var_dump( is_string($b) )  ; echo "<br>" ; 		// bool(true)
      var_dump( is_double($c) )  ; echo "<br>" ;		// bool(true)
      
      var_dump( Gettype($a) ) ; echo "<br>" ;		// string(6) "double"
      Settype($a,'string');
      var_dump( Gettype($a) );					// string(6) "string"
?>	
方法
isset() 判断某个变量是否存在
unset() 删除某个变量
empty() 判断数据是否为空

进制转换

描述 返回值类型
Decbin(int) 十进制转二进制 string
Decoct(int) 十进制转八进制 string
Dechex(int) 十进制转十六进制 string
Bindec(int) 二进制转十进制 string
Octdec(int) 八进制转十进制 string
...
<?php
      $a = 1011;
      $b = 015243;
      $c = 0x15a151f21c;

      echo $a ,"<br>";
      echo $b ,"<br>";
      echo $c ,"<br>";

      echo "<hr>";

      var_dump( bindec( $a ) ) ; echo "<br>";
      var_dump( decbin(5) ) ;     echo "<br>" ;    
      var_dump( octdec(54623) );
?>

字符串

nowdoc,nowdoc字符串

  • 单引号与双引号

  • nowdoc字符串 (<<<'')

  • heredocs 字符串(<<<)

    <?PHP
    //heredocs 字符串
          $str = <<<EOD
                helloWorld 
    EOD;
    //nowdoc字符串
          $str1 = <<<'EOD'
                hello
                      world
    EOD;
    
          echo $str ,"<br>",$str1;
    
    ?>
    

字符串相关的函数

strlen() 得到字符串的长度(字节为单位)
Implode(string $glue,array $arr) 数组转字符串
Explode() 字符串分割
Str_split() 根据长度来分割字符串
Substr() 指定位置截取字符串
Strstr() 从指定字符开始截取到最后
Trim() 清除字符串两边的空格,也可清除字符串两边指定的字符
Ltrim() 清除左边的...
Rtrim() 清除右边的...
Strtolower() 全部小写
Strtoupper() 全部大写
Ucfirst() 首字母大写
Strpos() 字符在字符串中首次出现的位置
Strrpos() 字符在字符串中最后出现的位置
Str_replace() 将目标字符串中部分进行替换
printf/sprintf(string $format) 格式化输出数据
Str_repeat() 重复某个字符串N次
Str_shuffle() 随机打乱字符串
...

字符串长度问题

  • 中文在utf-8编码中占3个字节
  • mbstring扩展(需要在php.ini配置文件中开启)
<?PHP
      $str= "啊啊11";
      echo strlen($str),"<br>";//8
      echo mb_strlen($str,'utf-8');//4
?>

数组

数组的定义

  • 使用array关键字定义
  • 作用中括号

数组的分类

  • 索引数组 : 整数作为索引
  • 关联数组 : 非整数转为索引
  • 混合数组 : 索引仅有整数又有非整数(字符串,bool)
<?php
      $arr1 = array(1,'2',3,'四');        //索引数组

      $arr2 = array(          // 关联数组
            "name" => "小李",
            "age" => 18,
            "TD" => "student",
      );

      $arr3 = [1,2,4,6,8,10]; //索引数组

      $arr4[] = 10;           //混合数组
      $arr4[1] = 11;
      $arr4[10] = 11;
      $arr4s["sex"] = "x";
  	  $arr4[] = "adada";
      
	  echo "<pre>";
      var_dump( $arr1 ) ; echo "<br><br>";
      var_dump( $arr2 ) ; echo "<br><br>";
      var_dump( $arr3 ) ; echo "<br><br>";

      var_dump( $arr4 ) ; echo "<br><br>";
?>

二维数组


<?php
      $arr = array(
            array( "name"=>'xiaoli',"age"=>18),
            array( "name"=>"zhangshan" ,"age"=>25),
            array( "name"=>"xiaoming" ,"age"=>35)
      );
      echo "<pre>";
      var_dump($arr);

?>

数组的遍历

  • foreach 遍历
<?php
      $arr = array(
            array( "name"=>'xiaoli',"age"=>18),
            array( "name"=>"zhangshan" ,"age"=>25),
            array( "name"=>"xiaoming" ,"age"=>35)
      );
      echo "<pre>";
      // var_dump($arr);

      var_dump( $arr[0]['name'] );
      var_dump( $arr[1] );

      echo "<hr>";

      foreach($arr as $value){
            var_dump( $value );
      }

      echo "<hr>";

      foreach($arr as $value){
            foreach($value as $key=>$value2){
                  echo $key ," = ",$value2 , "<br>";
            }
      }
?>
  • for循环遍历(数组的下标要有规律)
<?php
      $arr = array(
            array( 2,4,6,8),
            array( 1,3,5,7,9),
            array( 1,2,3,4,5,6,7,8)
      );
      echo "<pre>";

      for($i=0;$i<count($arr);$i++){
            for( $j=0;$j<count($arr[$i]) ; $j++ ){
                  var_dump($arr[$i][$j]);
            }
      }
?>

each 和 list

  • each 获取一个数组中当前数组指针所指的元素的下标和值,然后数组指针下移 返回一个数组(array(4))-
    • [0] => 取得元素的下标
    • [1] =>取得元素的值
    • ["key"]=>取得元素的下标
    • ["value"]=>取得元素的值

each 获取失败时返回false

  • list 是一种结构(无返回值)提供一堆变量去存入数组中的值(数组的下标要有序)

list 从0开始依次++

<?php
      $arr = array( 9,8,7,6,5,4);
      echo "<pre>";
      list($first,$second) = $arr ;

      echo $first , $second;//98
?>

list each 搭配while遍历数组

  • 数组的下标有限制
<?php
     $arr = array( 9,8,7,6,5,4);
     echo "<pre>";


     while(list($key,$value) = each($arr)){

           echo $key ," = " , $value,"<br/>"; 
     }
?>

数组排序函数

sort() 顺序排序(下标重排)
rsort() 逆序排序
asort() 顺序排序(下标不变)
arsort() 逆序排序(下标不变)
ksort() 顺序排序(按照下标)
krsort() ...
shuffle() 随机打乱数组元素
<?php
      $arr = array( 9,8,7,6,5,4);
      echo "<pre>";


      while(list($key,$value) = each($arr)){

            echo $key ," = " , $value,"<br/>"; 
      }


      echo "<hr>";
      asort($arr);

      foreach( $arr as $key => $value){
            echo $key , " = " , $value ,"<br>";
      }

      echo "<hr>";

      krsort($arr);
      foreach( $arr as $key => $value){
            echo $key , " = " , $value ,"<br>";
      }

      echo "<hr>";

      ksort($arr);
      foreach( $arr as $key => $value){
            echo $key , " = " , $value ,"<br>";
      }
      echo "<hr>";

      sort($arr);
      foreach( $arr as $key => $value){
            echo $key , " = " , $value ,"<br>";
      }
      
?>

数组指针函数

reset() 重置指针,将数组指针指向首位 返回第一个元素的单元值,如果数组为空返回false
end() 重置指针,指向最后一个元素,返回。。。
next() 指针下移,返回。。。
prev() 指针上移,返回。。。
current() 返回指针当前对应的元素值。。。
key() 返回当前的下标值。。。

数组的其他函数

count() 统计数组的长度
array_push() 在数组后面追加一个元素
array_pop() 移除数组后面一个元素
array_shift() 在数组最前面移除一个元素
array_unshift() 在数组最前面添加一个元素
array_reverse() 翻转数组
in_array() 判断一个元素是否存在与数组中
array_keys() 获取数组中所有下标,返回一个数组
array_values() ...

运算符

比较运算符

  • !== 不全等于 ,只要大小 或 类型 不同就返回 true

连接运算符

  • . 将两个字符串连接起来
  • .= 类似于+=、 -=、*=

错误抑制符

  • @ eg: @(1/0)

位运算符

  • ...

流程控制替代语法

替代 原因
for(;😉{} for(;😉: endfor; { 替换为 : , }替换为 endfor
if(){} if: endif; { 替换为 : , }替换为 endif
switch(){} switch:endswitch; { 替换为 : , }替换为 endswitch
while() .. ..

常用的系统函数

名称 描述 返回值类型
有关输出的函数
print() 本质是一种结构(不是函数)可以用使用括号 功能类似于echo
print_r() 类似于var_dump(),但不会输出数据的类型 ,多用于数组的输出
时间函数 描述 返回类型
date(string $format) 按照指定时间格式...
time(void) 计算机元年到当前时间的秒数 int
microtime() 获取微秒级别的时间
strtotime() 按照规定格式的字符串转换成时间戳
<?php
      echo date("Y年m月d日 H:i:s") , "<br>";		//2020年01月07日 20:23:53
      echo time() , "<br>";						//1578399833
      echo microtime();							//0.98924500 1578399833
      echo strtotime('tomorrow 6 hours');		//1578434400
?>

文件加载

include

  • include 系统碰到一次include 就会加载一次,如果一个文件多次包含 , 那么系统就会多次加载
  • include_once 同一个文件包含多次时 ,只加载一次

require

include 和 require的区别

  1. include的报错级别低不会影响后面的代码的执行 ,require 报错会中断程序的运行

函数

没有写函数类型时,系统默认为void类型

<?php
 	function f1(){ echo __FUNCTION__ ;};   	
     var_dump( f1() );				//f1NULL
 ?>

形参的默认值

  • 有默认值的参数要写在最右边
	<?php
		function f1($a , $b=0){	
			return $a+$b;
		}
		echo f1(2);
	?>

引用传递

    <?php
    	$a=5;
          function f1( &$x , $y=2){
             	$x /=$y;
          }
     	 echo  $a ;	//2.5    
    ?>

return

return还可以直接写在文件里(‘全局’)表示终止,后面的代码不再运行 但其他文件include/require 该文件时 可以定义一个变量来接收 返回的数据(实现数据的传递)

image-20200107220334697

作用域

PHP无块级作用域,有函数作用域
PHP中全局变量不能再局部作用域中使用
超全局变量会自动将全局变量纳入到$GLOBALS里,且$GLOBALS没有作用域限制。

  1. 全局作用域(函数外部定义的变量)

  2. 局部作用域(函数内部定义的变量)

  3. 超全局作用域

  4. $global

  5. 常量没有作用域限制

<?php
      $G =   "全局声明";            
      function f1(){ 
            global $G;        // 引入全局变量
            echo $G , "<br>";

            global $a ;       // 此时不能赋值
            $a = 55;      //赋值    

      }
      f1();
      echo $a;          // 访问“局部”
?>

可变函数

<?php
	function func1(){
        echo __LINE__,__FUNCTION__;
      }    
      $f2 = 'func1';
      $f2();	//197func1	 //相当于f1()
?>

匿名函数

<?php
	$f1 = function(){ 
		echo "匿名函数";
	};	// 该分号不可省略
	$f1();
?>

闭包(closure)

  • 产生原因:内部函数(内嵌函数)
  • use :将外部变量(局部) 保留给内部使用 // 类似于值传递
	<?php
     function f1(){
           $a = 1;
           
           $f2 = function() use($a){
                 echo  $a+=100;
                 $c=0;
           };
           $f2();      //2

           echo "<br>" , $a; //1

     }
     f1();
?>

伪类型

Mixed

混合类(可以是多种PHP中的数据类型)

Number

数值类(可以是任意数值类型(整型,浮点型))

常见的数学函数

名称 描述
max() 参数可以是数值,也可以是数组
min() ...
rand()
mt_rand() 功能与rand一样,效率比rand高
round() 四舍五入
ceil() 向上取整
floor() 向下取整
pow() ...
abs()
sqrt()

有关函数的函数

function_exists() 判断指定的函数是否存在
func_get_arg(int) 在自定义函数中获取指定数值对应的参数
func_get_args(void) 在自定义函数中获取所有参数集(数组)(实参集
func_num_args() 获取自定义函数的参数数量(实参的数量)
<?php
      function f1($a  , $c = 22){
            $a = 11;		// 给参数重新赋值
            $c = 55;
            
            var_dump( func_get_arg(0) )  ; echo "<br>","<pre>";	//int(11)	被更改了
            var_dump( func_get_args() )  ; echo "<br>","<pre>";//无有默认值的参数
            var_dump( func_num_args() )  ; echo "<br>","<pre>";//int(1)无有默认值的参数
      }
      
      function_exists('f1') && f1(111);
?>

错误处理

分类

  • 语法错误 : 编译不会通过
  • 运行错误 : 语法没错 但runtime error
  • 逻辑错误 :

错误代号

  • 系统错误 :

    • E_PARSE 编译错误(parse error)
    • E_ERROR 致命错误(fatal error)
    • E_WARNING 警告错误(waring,不会影响程序执行但有可能会得不到想要的结果)
    • E_NOTICE 通知错误(notice)
  • 用户错误:

    • E_USER_ERROR , E_USER_WARNING , E_USER_NOTICE
  • 其他 : E_ALL (所有的错误)

错误代号之间 可以进行位运算

  • 排除通知级别 : E_ALL & ~E_NOTICE
  • 只要警告和通知: E_WARNING | E_NOTICE

错误触发

  • 系统触发
  • 人为触发

错误处理函数

  • trigger_error() 错误处理函数
<?PHP
      $a = 0;
      if($a==0){
            trigger_error("被除数不能为0");//Notice: 被除数不能为0 in F:\桌面\php02\....
      }else{
            echo 100/$a;
      }
?>
<?PHP
      $a = 0;
      if($a==0):
            trigger_error("被除数不能为0",E_USER_ERROR);//Fatal error: 被除数不能为0 i...
      endif;      
      echo 100/$a;
?>

错误设置

  • 错误显示设置
    1. php的配置文件(修改php.ini文件)

      • DisPlay_error 是否显示错误 (约461行 默认为E_ALL)
      • Error_reporting 显示什么级别的错误 (约478行 默认为On)
    2. 在运行的php脚本中设置

      • Error_reporting() 设置对应的错误显示级别
      • Ini_set('配置文件中的配置项','配置值')

错误日志

  1. 开启日志功能(log_errors = On),修改 error_log = "日志路径"

自定义错误处理

  • trigger_errors() 不会阻止系统报错
  • set_error_handle( $callback )
<?PHP      
      /**
       *    $errno      系统提供的错误代码 (E_ALL , E_NOTICE..)    
       *    $errstr     错误信息
       *    $errfile    错误所在的目标文件
       *    $errorline  错误所在的行数
       */
      function my_error($errno , $errstr,$errfile,$errorline){
            switch($errno){
                  case E_ERROR:
                  case E_USER_ERROR:      
                        echo  "fatal error in file " . $errfile ."  ".$errstr . $errorline;
                        break;
                  case E_WARNING:
                  case E_USER_WARNING: 
                        echo "warning in file " . $errfile.$errstr . $errorline;
                        break;      
                  case E_NOTICE:
                  case E_USER_NOTICE:
                        echo "notice in file ".$errfile." ( ".$errstr." in ".$errorline . "lines )";
                        break;      
            }
            return true; 
     }   
     set_error_handler('my_error');
     echo $a;//notice in file F:\桌面\php02\text.php ( Undefined variable: a in 274lines )

?>
posted @ 2020-01-13 09:52  Tolbert  阅读(159)  评论(0)    收藏  举报