细说php入门学习

文章目录

  • 1. php基本语法
  • 2. 变量
  • 3. 数据类型
    • (1). 整型 interger
    • (2). 浮点型 float
    • (3). 布尔型 boolean
    • (4) 字符串 string
    • (5). 数组 array
    • (7). 对象 boject
    • (8). 资源 resource
    • (9). 空null
  • 4. 常见函数以及基本语法
    • (1). 三种常见函数
    • (2). 四种常见输出
    • (3). 自动类型转换
    • (4) .强制类型转换
    • (5) . 常量
    • (7). 运算符
  • 5.流程控制
    • (1) 分支结构 if / switch
    • (2). 循环结构
        • 1.while循环结构
        • 2.doWhile 循环
        • 4.for循环
        • 5.混合写法:
        • 6.多重循环
        • 7.流程控制符
  • 6. 函数function
    • (1).函数命名规范
    • (2) . 函数返回值
    • (3). 参数
    • (4). 变量作用域
    • (5). 静态变量
    • (6). 自定义函数
  • 7. 数组 array
    • (1).定义格式:
    • (2).遍历数组
    • (3). 指针函数
    • (4). 预定义数组
  • 8. 正则
  • 9. 时间
  • 10. 错误
    • (1) 错误的三种领域
    • (2).错误级别
    • (3). 屏蔽错误
    • (4). 自定义报错
    • (5). 逻辑错误
  • 11. 文件
    • (1) 文件属性: 常见分类
    • (2) 文件分类
    • (3). 文件路径
    • (4)文件-目录-操作
    • (5) . 文件加载
    • (6) 递归函数
    • (7) 文件内容 文件操作
    • (8) 接收上传内的文件
    • (9) 验证
    • (10) 高频率 uuid 设置唯一的id
    • (11) 文件下载
  • 12 .面向对象
    • (1) 对象
    • (2) 伪对象 $this
    • (3) 连贯操作 OOP
    • (4)魔术方法
    • (5) PDO 操作数据库 ( 数据库抽象层 )

1. php基本语法

  1. php 服务器语言

    • 服务器: Apache服务器
    • PHP文件: 存放wamp/www目录
  2. 访问方式

    • 只能通过浏览器访问,访问地址**: lcoalhost**

    • 代表访问本地服务器

  3. PHP是什么?

    • 超文本预处理器

    • 一句话: 一种用来开发动态网站的服务器脚本语言

  4. PHP文件

    • 格式: ***.php
  5. 定界符

  6. 注释

    • // 单行

    • #单行

    • /* 多行 */

  7. 设置编码

    • header( 'content-type: text/html; charset-编码 ')
  8. PHP基本语法

    • 每一条PHP命令均已分号结尾.发表该php命令结束其中,最后一条命令可以省略分号,推荐加上分号

    • php报错 不是当前行 就是上一行

2. 变量

  1. 含义: 变量理解为数学中的未知数

  2. 声明变量:

    • 格式: $变量名=值

    • 内存: 一旦申明一个变量,就会占用一定的内存
      + 当程序结束,没有人在引用变量时,就会被删除

      		+ 注意点: 若变量没有值,则被称之为未定义变量,该变量会报错.
      
  3. 变量命名规范

    • 有数字,字母和下划线组成
    • 不能以数字开头
    • 支持中文., 但不推荐
    • 变量名要有意义
  4. 可变变量

    • 将一个变量的值,作为另一个变量名来使用
    $name = '山鸡';
    $山鸡 = '乌鸡';
    $乌鸡 = '呜呜呜';
    echo $$$name;
    
    则会输出 : 呜呜呜
    
  5. 引用变量值:

    1. 传值

      $a = 100;
      $b = $a;
      $b = 200;
      echo $a,$b
      这时,$a=100 $b=200; 
      传的是值所以$a不改变
      
    2. 传址 &

      $a = 100;
      $b = &$a;
      $b = 200;
      echo $a,$b
      这时,$a=200 $b=200; 
      传的是址所以$a改变
      

3. 数据类型

1. 标量类型
int 整型
float 浮点型
bool 布尔型
string 字符串
2. 复合类型
array 数组
boject 对象
3. 特殊类型
resource 资源
nul
判断是否为某种类型
is_string ( 变量) 判断是否为字符串
is_numeric( 变量) 判断是否为数字字符串
is_scalar( 变量) 判断是否为标量
is_int( 变量 ) 判断是否为整型
is_float(变量) 判断是否为浮点型
is_array( 变量) 判断是否为数组
is_object( 变量) 判断是否为对象
is_resource( 变量) 判断是否为资源

(1). 整型 interger

最大整型: PHP_INT_MAX 超过最大整型转为浮点型.

进制 基数 前缀
二进制 0-1 0b
八进制 0-7 0
十进制 0-9
十六进制 0-9 a-f 0x

进制转换:

  1. 任意进制—> 十进制:
    基数 * 进制 ^ 次方

  2. 十进制—> 转任意进制
    将十进制除以 任意进制, 结果到倒取余


(2). 浮点型 float

浮点型:

  • 小数

  • 科学计数法 2e3 2e4 …3*10 的3次方…

  • 浮点数不适合做运算

  • 有效位数: 从前向后,第一个非0数字开头, 向后保留14位.

(3). 布尔型 boolean

  1. 布尔型 bool 的值:

    • true 对,肯定.是,1,可以…

    • false 错,否认,否,0,不可以…

    • 作用: 当运算不能直接表达, 一般会使用bool来表达状态

有 七种 值与false等价:
false
0
0.0
‘’ , ‘0’
null
空数组
未定义的变量

(4) 字符串 string

  1. 格式:

    1. 单双引号 : 单双引号的共同特性: ( 单双引号可以互插,不能自插. )
      单引号:

      • 不解析变量

      • 不解析转义字符,但解析转义转义字符.

        + 转义符: \
        + 常见转义:  \n 换行			 \r  回车		\t  制表符 Tab
        + 转义 转义字符
                + \' 普通单引号
                 + \" 普通双引号
                 + \\ 普通斜杠
                    + \$ 普通$符,不再有变量声明的意义了		
        

      1. 双引号:
        • 解析变量 变量最好用{}包起来
        • 解析转义字符
    2. heredoc结构

      $a = <<<xxoo
      		输出多行文字或者什么的时候的是可以利用heredoc排版
      		
      xxoo;

(5). 数组 array

  1. 定义: 容器,可以容纳任意数据

  2. 声明:

    1. 格式1: $变量名[ ] : 值
    2. 格式2: $变量名 = [ 值1, 值2 , …]
    3. 格式3: $变量名 = array(值1,值2,…)
  3. 组成:

    1. 数组是由键和值 组成

    2. 数组的键: int 或者 string

      ​ 键的别名: 偏移量 下标 索引

    3. 数组的值: 任意类型的值

    4. 操作数组:

      • 读取: 通过键来读取数组的值
      • 修改: 通过已有的键 来修改数组的值
      • 新增: 通过没有的键 来新增数组的值
      • 删除: 通过unset( )函数来删除值

(7). 对象 boject

  1. 一切皆对象

  2. 简单获取一个对象

    $obj = new stdclass;

    var_dump($obj);

(8). 资源 resource

  1. 任何文件都是资源

  2. 简单获取一个资源

    fopen( 文件路径, 文件打开方式 r 只读 w写入)

(9). 空null

  1. 什么都没有过,占有内存,但内存中没有具体内容
  2. 常用与占位
  3. echo 不能输出null
  4. 以下有三种情况直接null
    1. 直接赋值 null
    2. 未定义的变量
    3. 被删除的变量 nuset

4. 常见函数以及基本语法

(1). 三种常见函数

在PHP中: 如果只是为了输出一句话
简化为

三种常见函数 功能 返回值
empty(变量 ) 判断一个变量是否为空( 只要与false等价,都为空) 空 => true // 非空 => false
isset(变量 ) 判断一个变量是否设置,
(只有null 和 未定义变量是没有设置过的)
设置 => true // 未设置=> false
unset(变量 ) 删除变量, 从而释放内存 返回值: 无

内存 注意点:

  1. 每定义一个变量,系统就会分配一个内存给变量
  2. 当内存没有被任何变量引用时,就会自动释放
  3. 函数: 一个函数没有返回值时, 强行接收, 则只会接收到null

(2). 四种常见输出

  1. echo

    • 支持intfloat, string, resource 的输出
    • 属于 语法结构, 不是函数
  2. print 或 print( )

    • 支持int,float,string,resource的输出

    • print 语法结构

    • print( ) 函数

      ​ 返回值: int

  3. print_r( );

    • 除了bool 和null 不能输出,其余都可以输出
    • 函数,返回值:bool
    • 输出理论无限制,实际受限于内存
  4. var_dump

    • 支持 任意类型
    • 函数,返回值:无
    • 输出有上限

小结:

​ print_r 适合大批量数据输出

​ var_dump 仅仅用于测试, 信息全面(文件地址,行高,数据类型,值,长度)

(3). 自动类型转换

  • 弱类型语言: 支持隐式转换

  • 强类型语言: 不支持隐式转换

  • 隐式转换: 偷偷将数据类型 进行转换

  • PHP 属于 弱类型语言

(4) .强制类型转换

  1. 临时转换

    只是暂时将变量类型转为其他类型,但本声不变.

    运算符强制转换
    (bool)$str 布尔型
    (int)$str 整型
    (float)$str 浮点数
    (string)$str 字符串
    (array)$str 数组
    (object)$str 对象
    函数强制转换
    intval($str) 整型
    floatval($str) 浮点型
    boolval($str) 浮点型
    strval($str) 字符串
  2. 永久转换

    settype ( 变量 , 类型 )

(5) . 常量

  1. 经常不变化的量,即为常量.

  2. 注意点:

    1. 严格区分大小写,推荐大写
    2. 常量不能重新赋值
    3. 常量不能重新定义
  3. 格式: const 常量名 = 常量值

  4. 格式: define ( 常量名, 常量值 , bool ) bool值确认是否区分大小写.

  5. 预定义常量

    预定义常量 功能
    PHP_INT_MAX 最大整型数
    M_PI 圆周率
    PHP_OS 当前PHP所在系统
    PHP_VERSION 当前PHP版本
  6. 魔术常量

    预定义常量
    __DIR__ 获取当前文件的所在目录
    __FILE__ 获取当前文件的盘符路径
    __LINE__ 获取当前行号

(7). 运算符

  1. 算数运算符

    1. + - * / % 加减乘除取余.

    2. 余数 % 除了求余之外,还有2种特殊功能

      1. 余数的正负: 取决于 第一位的正负

      2. 取余的范围: %x 结果: [ 0 ,x )

        结果范围    x ~ y
        
          0 ~ y-x  %(y-x+1)
          +x
          ------------------
          x ~ y 
          
          结果:  %(y-x+1) + x
         
        
        求奇偶数 
        	余数为0  即为偶数
        	余数为1  即为奇数
        	
        	结束范围: 0~1
        		%2
        
        1. 求任意数字的 个位数 0 ~ 9
        	$a = 123;
        	var_dump( $a % 10 );  101次方
        
        2. 求任意数字的 最后两位  00 ~ 99
        	$a = 123;
        	var_dump( $a % 100 );  102次方
        
        3. 求任意数字的 最后n为  
        	 	%10的n次方
        
  2. 自增\自减

  • ​ ++ 变量a 自己给自己+1
    a++ 先返回a 在给a+1
    ++a 先给a+1 在返回a

  • ​ – 变量自己给自己-1
    a-- 同上
    –a 同上

  1. 字符串拼接

    • 拼接符 . 小数点

    • 主要用于:

      • 字符串.变量
      • 变量.字符串
      • 变量.变量
  • 单引号的速度 比 双引号的块

  • 为了整个项目的运行速度考虑:

  • ​ 如果变量较少,推荐用单引号,变量用拼接

  • ​ 如果变量较多,使用双引号,变量用{} 包起来

  1. 赋值运算符

    赋值运算符 含义
    = 将 = 右边的 赋给 左边的
    += a += b ==> a = a + b
    -= 同上
    *= 同上
    /= 同上
    %= a .= b ==> a = a . b
  2. 比较运算符

    比较运算符 含义 注意点: 所有的比较结果: 都是bool值
    > >= 大于 大于等于
    < <= 小于 小于等于
    == 判断两边的值是否相等
    === 全等: 判断两边的值是否相等 且 数据类型相等
    != 判断两边的值 是否不等
    !== 不全等: 只有全等时为false, 其余都是true
  3. 逻辑运算符

    逻辑运算符 含义: 注意: 所有的逻辑运算符结果都是: bool值
    逻辑与 && 两边为真即为真, 一边为假即为假
    逻辑或 一边为真即为真, 两边为假即为假
    逻辑非 ! 真即是假, 假即是真
  4. 三元运算符

    三元运算符
    ++ – ! …等 一元运算符
    + - * / % …等 二元运算符
    条件表达式 ? true环境 : false环境 三元运算符:仅仅适合 做一些简单判断

5.流程控制

(一). 顺序结构 : 代码从上往下依次执行

(二). 分支结构 : 通过 if /switch 进行分支选择

(三). 循环结构 : 将一些功能 不断重复去执行

(1) 分支结构 if / switch

分支结构: 具有跳过某一段代码的功能

if 分支结构

分支写法1:
if ( 条件表达式 ) true环境1
//不用加{} 条件仅仅只能影响紧跟在if后面的一条命令


分支写法2:
if ( 条件表达式 ){
    true环境
}
//条件仅仅能影响后面 {} 内的所有代码.


分支写法3:
if ( 条件表达式 ){
	true环境
}else{
	false环境
}
// 条件为真时,则进入true环境,否则进入false环境


分支写法4:
if ( 条件表达式1 ){
	true环境1
}elseif( 条件表达式2 ){
	true环境2
}elseif( 条件表达式3 ){
	true环境3
}...
// 从多个表达式中,选择一个满足( 符合先来后到的原则 )


分支写法5: 
巢状分支.
if ( 条件表达式1 ){
	if ( 条件表达式2 ){
		if ( 条件表达式3 ){
			...
		}
	}
}

switch分支结构

switch( 标志 ){
    case '标志1': 代码块;   break;
    case '标志2': 代码块;   break;
    case '标志3': 代码块;   break;
    case '标志4': 代码块;   break;....
    default 代码块;
}

//不写break  则匹配到符合条件 后的所有case都会执行
  写上break  则只会执行符合条件的一条代码.
  如果没有找到标志, 则会执行 default 
  

(2). 循环结构

1.while循环结构

​ while( 条件表达式 ){
​ 代码块
​ }

  • 如果条件为真 -> 则执行1次 代码块 -> 再回到条件表达式 -> 再次判断条件 真 -> 再执行1次代码块 …
  • 当条件为假 -> 立马结束循环 -> 准备执行循环外的代码
$i=0;
while($i<10){
    echo $i;
    $i++;
}
//输出 123456789

2.doWhile 循环

while 和dowhile的区别

  • while 先条件判断,在决定是否执行代码块
  • dowhile 先执行一次代码块,在条件判断,然后决定是否执行代码块
doWhile循环
do{
    代码块1
}while( 条件2 )

执行顺序 1 2 12 12
注意点: 如论条件是否成立至少会执行一次代码块

4.for循环

​for循环

  1. 格式: for( 初始值1; 循环条件2; 循环增量3){
    代码块4
    ​ }

  2. 执行顺序
    1 243 243 243
    当条件2 为假时,则结束循环

  3. 初始位置和增量位置 可以不写值

for($i=0; $i<10; $i++){
    echo $i;
}
//输出 0123456789

5.混合写法:

以下所有写法,都是在html代码块中写的.
1.forHTML 混合写法
	 for( ):  ?>
		html原生代码
	 endfor   ?>
--------------------------------------	
2.ifHTML 混合写法
	 if( ): ?>
		html原生代码
	 endif(): ?>
--------------------------------------
  	 if( ):  ?>
  		html代码 true
  	 else( ): ?>
  		html代码 false
  	 endif   ?>
----------------------------------
	 if( ):   ?>
		html原生代码 true
	 elseif( ):  ?>
		html原声代码 true
	 elseif( ):  ?>
		html原生代码  true
	...
	 endif  ?>

6.多重循环

多重循环: 在循环中 嵌套循环

7.流程控制符

  1. break

    立马结束分支/循环,准备执行分支/循环外的代码

  2. continue

    立马结束当前一轮的循环,准备进行下一轮循环.

    1. for 碰到 cotinue,立马进入增量3
    2. while 碰到 continue,立马进入条件判断
  3. die /exit

    立马结束程序,die之前的代码依旧执行

    1. die ( 内容 )
    2. exit ( 内容 ) 在结束程序之前,在输出一次内容

6. 函数function

  1. 作用 : 用函数封装一些功能, 重复利用

  2. 函数分类:

    • 系统函数: 数学,字符串,数组,其他函数等
    • 自定义函数: 根据用户需求来封装函数
  3. 自定义函数: ( 声明 )

    • 格式:

      function 函数名 ( 参数 ){

      代码块

      }

    • 组成:

      • 关键字: function
      • 函数名 : 要有意义 ( 动词+ 名词)
      • ( ): 声明函数时的参数, 称之为形式参数, 简称形参
      • { }: 函数体代码块, 函数功能具体代码
    • 特性:

      函数不调用不执行

      函数一旦调用,name函数执行之后,会返回到调用函数的地方

    • 小结:

      功能相似, 位置相同 ,用 循环

      功能相似, 位置不同, 用函数

    • 调用函数:

      函数名( )

      函数名 ( 实参 )

(1).函数命名规范

  1. 命名规范

    1. 由数字,字母和下划线组成
    2. 不能以数字开头
    3. 不区分大小写
  2. 命名形式

    • 驼峰命名法

      从第二个单词开始,首字母大写

      function addUserName( ){ }

    • 帕斯卡命名法

      每个单词首字母都大小 ( 大驼峰 )

      function AddUserName( ){ }

    • 下划线命名法

      function add_user_name( ){ }

  3. 函数名不能重名

    function var_dump(){ }

    函数名不能重名包括系统函数和自定义的函数.

  4. 函数名要有意义

    看到函数名 就大致能猜出是什么意思

    多个单词组成的函数名: 动词 + 名词

    ​ getName( )

    ​ sendMsg( )

    ​ setInfo( )

(2) . 函数返回值

  1. 关键字: return

  2. 无return: 当函数的代码块全部执行, 会自动返回到调用函数的地方,没有返回值(自然结束) 若强行接收返回值,则得到null

    有return : 当函数的代码块执行到return时,则立马返回到函数调用的地方,返回return值(提前结束)

  3. 返回值的类型

    可以返回任意类型

  4. 如何返回多个值

    将多个值存入一个数组中,最终返回数组几个.

    在外面通过数组一个一个取出

    function demo3(){
    	$a = 10;
    	$b = 10.5;
    	$c = [$a, $b];
    	return $c;
    }
    

(3). 参数

  1. 形参: 在声明函数时给的参数 parameter

  2. 实参: 在调用函数时给的参数 argument

  3. 参数个数差异会有何种不同

    1. 实参个数 = 形参个数 完美

    2. 实参个数 > 形参个数

      多余的实参被抛弃,

      形参已按照先来后到的原则进行接收

    3. 实参个数 < 形参个数

      多余的形参: 1.被当成未定义的变量 会报错

      2.采用默认值

    4. 实参个数不确定时???

      计算器: 多个数字进行累加

      形参 一个都不要写

      通过几个函数来处理所有的实参

      函数 功能
      func_get_args( ) 以数组的形式接受所有的实参
      func_get_arg( n ) 值接受下标为n 的实参
      func_num_args( ) 获取实参的总个数
      function demo4(){
      	$sum = 0;
      	$total = func_num_args();
      	for ($i=0; $i < $total; $i++) { 
      		$sum = $sum + func_get_arg($i);
      	}
      	echo $sum;
      }
      

(4). 变量作用域

变量作用域: 变量只能在指定的区域 起作用

  1. 全局变量: 在函数外部定义的变量

  2. 局部变量: 在函数内部定义的变量

    注意:
    ​ 默认情况下:
    ​ ①. 全局变量 不能在局部环境中使用
    ​ ②. 局部变量 不能在全局环境中使用

    ​ 特殊情况下:
    ​ ①. $GLOBALS[ 变量名 ]
    ​ 可以在任意环境中使用, 该变量名 只能是全局环境中的变量

    ​ ⑤. global 变量
    ​ 该变量可以在函数外部直接使用

$a = 10; //全局变量
function demo1(){
	global $b;
	$b = 20; //局部变量
	echo $GLOBALS['a'];
//通过 $GLOBALS[ 全局变量名 ] 即可在局部环境中使用 全局变量
}
demo1();

// 在全局环境中, 可以输出 global修饰的 局部变量
echo $b;

(5). 静态变量

  1. 关键字 : static
  2. 定义: 在函数结束时,不会被删除,当下一次在调用次函数时,可以获取上一次静态变量值.
  3. 仅限于函数内部使用
function demo2(){
	static $b = 50;
	echo $b.' ';
	$b++;
}

demo2(); 50
demo2(); 51
demo2(); 52...

(六). 函数技巧

变量技巧
	可变变量: 将一个变量的值 作为另一个变量名 来使用
	引用变量 	
	
函数技巧
	可变函数: 将一个变量的值 作为函数名 来使用
	引用函数:  通过 &符 将内存地址赋予 
// 引用函数例:
function demo3(&$x){
	$x++;
	echo 'x = '.$x.'
'
; } $b = 20; demo3($b); echo 'b = '.$b.'
'
;

(6). 自定义函数

小技巧:
做任何功能, 考虑以下几点

1. 函数名   
2. 参数 
	几个形参
	形参要不要默认值
3. 核心功能
	如果 核心需要 参数配合, 其余数值配合, 可以先做 模拟数据
4. 补充
	缺什么参数, 补什么参数
	缺什么值, 补什么值

7. 数组 array

(1).定义格式:

array(=>  值
	key => value,
	key => value,
	...
	key => value,
)
  1. 键: 只有int 或 string .

    如果设置键为 float ,bool等其他类型,则会强制转为int 或string.

    键的别名: 下标 偏移量 索引, index offset

  2. 值: 任何类型

  3. 分类

    索引数组: 键为 int

    关联数组 : 键为 string

  4. 格式:

    $数组名[键] = 值

    $数组名 = [ 键1=> 值1, 键2 => 值2 ,…]

    $数组名 = array( 键1=> 值1, 键2 => 值2 ,…)

  5. 小结

true = 1 = 1.x         //等价
false = 0 = 0.0 = '0' = 0.x
null = '' = 未定义变量

非法下标:
	数组
	对象
  1. 多维数组

    在数组中, 值设为数组,即为多维数组

(2).遍历数组

  1. 基本遍历方法: for while doWhile

  2. 指针遍历方式: foreach

  3. 指针遍历: 不需要考虑初始值, 不需要考虑增量, 不需要考虑条件

    只能接受当前一轮的键 , 每一次循环, 都只能接收一个键或值

    擅长遍历 非索引,非规律数字的数组
    foreach( 数组名 as=>){
    	代码块
    }
    
    若只需要值, 不需要用键, 可以简化写法
    foreach( 数组名 as){
    	代码块
    }
    

(3). 指针函数

函数名 功能
current( ) 获取当前指针所指向的值
key( ) 获取当前指针所指向的键
next( ) 将指针 下移一位
prev( ) 将指针 上移一位
reset( ) 将指针重置到第一位
end( ) 将指针重置到最后第一位
each( ) 获取当前指针的键和值, 且下移一位

一旦超出范围, 是无法通过next 或 prev 返回数组中

next 和 prev 相对性的 移动指针

解决方案: 通过 reset 或 end 回到数组中

(4). 预定义数组

php系统预先定义好的"数组".

预定义数组名 功能
$GLOBALS 获取全局环境中所有可用的变量 (超全局变量)
$_GET 接收所有以get方式传递过来的值
$_POST 接收所有以post方式传递过来的值
$_FILES 用于接收上传的文件
$_COOKIE 存储浏览器端的cookie
$_SESSION 存储服务器端的session
$_REQUEST 接收get, post 和cookie 的值
$_SERVER 存储服务器相关的信息. 例如: 服务器名, 地址, 参数, 协议, IP …
$_SERVER的数组中
下标 描述
HTTP_HOST 主机名
HTTP_USER_AGENT 终端, 浏览器信息
REMOTE_ADDR 客户端IP
SERVER_ADDR 服务器IP
SCRIPT_FILENAME 脚本地址( 盘符 )
SCRIPT_NAME 脚本地址( 网址 )
REQUEST_METHOD 请求方式
REQUEST_URI 请求地址 (带参数)
QUERY_STRING 请求参数

字符串可以当索引数组来用.

      0123456
$a = 'abcdefg';

访问 字符c
echo $a[2];
echo $a[6];

超出范围, 返回 空字符串
衍生: 遍历字符串时, 得到 空字符串, 则证明字符串已经遍历完了
echo $a[999];
var_dump($a[999]);

8. 正则

  1. 正则表达式 含义 : 用某种模式去匹配字符串的一个公式
  2. 功能:由正规字符查询 替换操作
  3. 组成: 有正规字符和一些特殊字符构成
/^[0-9]+abc$/
1.定界符 /   
2.开始标志 ^
3.[0-9]原子
4.元字符
5.abc原子
  1. 可见原子:

    unicode编码表中用键盘输出后肉眼可见的字符

    1. 标点;“‘ _ ? . 等等
    2. 英文字母数字 a-z,A-Z,0-9
    3. 汉字、日文、阿拉伯文等其他语言文字
    4. Σ θ ∈ ≌ 等数理化公式符号
    5. 其他可见字符
  2. 不可见原子:

    unicode编码表中用键盘输出后肉眼不可见的字符

    1. 换行, 回车,制表符,空格. 与其他不可见元素
  3. 元字符

| 元字符:

  1. 原子的筛选方式
    | 匹配两个或者多个分支选择
    [] 匹配方括号中任意一个原子
    [^] 除了括号内的不可匹配,[]外匹配任意一个原子
    2. 原子归类
    . 匹配除了换行符之外的任意字符
    \d 匹配任意一个十进制数字 [0-9]
    \D 匹配任意一个非十进制数字 [ ^0-9]
    \s 匹配一个不可见原子 [\n\t\r]
    \S 匹配一个可见原子 [ ^\n\t\r]
    \w 匹配任意一个数字字母或下划线 [0-9a-zA-Z]
    \W 匹配任意一个非数字字母或下划线 [ ^ 0-9a-zA-Z]
    3. 量词 {n} 表示其前面的一个原子恰好出现n次
    {n,} 表示其前面的一个原子最少出现n次
    {n,m} 表示其前面的一个原子最少出现n次,最多出现M次.
    * 匹配0次,1次,或者多次其前面的原子 {0, }
    + 匹配1次或者多次其前面的原子 {1, }
    ? 匹配0次或者1次 其前面的原子 {0,1}
    4. 边界控制, 模式单元, 模式选择符
    ^ 匹配字符串开始位置
    $ 匹配字符串结尾位置
    () 匹配其中的整体为一个原子
    ( | ) 匹配其中的两个或更多的选择之一, 分隔多选一模式
    5. 模式修正符 在定界符的后面
    贪婪匹配 U 匹配结果存在歧义时,取其长 例: .*/U
    懒惰匹配 U 匹配结果存在歧义时,取其短 .*?/U
    忽略空白 X 匹配结果忽略空白
    大小写匹配 i 匹配结果不区分大小写
  2. 单次匹配函数

    preg_match( 正则, 对象, 结果) 结果是一个数组 返回每个匹配到的原子 返回值时1或者0
    ​ 参数:
    ​ 正则: 根据需求设计正则
    ​ 对象: 将对象匹配正则
    ​ 结果: 以数组形式接收 匹配的结果, 可省略

    返回值: 成功的匹配的次数
    成功: 1次
    失败: 0次

    常用于: 判断是否匹配成功

  3. 匹配全部函数

    • preg_match_all( 正则, 对象 [,结果])
    • 返回值: 匹配的次数
      ​ 成功: >= 1
      ​ 失败: = 0
:
只获取字符串中的所有汉字  \x{4e00} ~ \x{9fa5}
$preg = '/[\x{4e00}-\x{9fa5}]/u';
$total = preg_match_all($preg, $str, $result );
  1. 正则替换函数

    • preg_replace( 正则, 替换值, 对象 )
    • 常用于敏感字等…
:
$str = 'MMP, 你是不是脑残啊, 脑子是不是不好使啊, MMP';

敏感词库
$keywords = ['MMP', '脑残'];
替换敏感字 占用了几位就几个星星
foreach($keywords as $v){
	1. 统计占几位
	$num = preg_match_all('/./u', $v);

	2.* 重复 num次
	$star = str_repeat('*', $num);

	3. 替换敏感词
	$str = preg_replace("/{$v}/", $star, $str);
}
	echo $str;

  1. 正则函数 过滤 ---- 向后引用

    preg_grep( 正则, 数组 )

    1. 过滤不符合正则规定的格式 	
    
      ​      	2. **一般与向后引用一起使用**
    
       ​    
    3. **向后引用**:   \1 		后面\1 与 前面第一个( )匹配的值 一模一样
    
       ​                   \num           后面\num 与 前面第num个( )匹配的值 一模一样
    

    条件: 在使用\1 或 \2 或 \num 之前, 前面得要有 ( ) 小括号

    注意: 在字符串中进行使用, 可以用 $1 或 $2 或 $num 来代替

  2. ( ) 单元模式

    1. 将( )内的内容当做一个整体, 作为一个大原子

      ( 这个大原子里面可能有好几个原子 但是看做一个原子了哦~~~)

    2. ( ) 内的内容送进 子模式组


注意点:  **被小括号包起来后** ,**被匹配的值 会进入到接收结果的数组中.** 也就是**子模式组**:  $time = '2019-01-23';
	 $preg = '/(\d{4})  -  (\d{2})  - (\d{2}) /x';
 	 preg_match($preg, $time, $result);
	 var_dump($result);


取消子模式:
	(?: 正则)  仅仅保留 当成一个整体的作用, 不再具备送进子模式组的功能
	例:  $time = '2019-01-23';
	 $preg = '/(?:\d{4})  -  (\d{2})  - (\d{2}) /x';
 	 preg_match($preg, $time, $result);
	 var_dump($result);

9. 时间

属性名 功能
date_default_timezone_set ( ‘PRC’ ); 设置时区为中国
date_default_timezone_get ( UTC ); 获取格林威治时间,所谓的世界标准时间 (默认UTC)
time ( ) 获取时间戳 从1970年-现在的秒数
格式化时间 data(格式 [, 时间戳] ) 非字母 随便写, 都是原样输出-------
字母严格区分大小写(大多数的字母都具有特殊意义)
Y year 4位年份 2019
y year 2位年份 19
m month 月份 01-12
d day 天 01-31
H hour 24小时 00~23
h hour 12小时 01~12
a am/pm 上午/下午
A Am/Pm 上午/下午
i minute 分钟 00~59
s second 秒 00-59
microtime ****** 微秒 获取的是一个时间戳
z 今天是今年的第几天
W 本周是今年的第几周
t 本月一共多少天
mktime( 时,分,秒,月,日,年 ) 自定义时间 返回值:时间戳
strtotime( ) 字符串转为时间戳 返回值: 时间戳
strtotime可以将字符串转为时间戳 配合data格式化时间 将其转为直观的年月日时间
now 本地现在的时间
yesterday 前一天
tomorrow 明天
last year 前一年
next year 明年
last minute 上一分钟
last week 上一周
5 day 5天后
-5 day 5天前
10 second 10秒之后
最多支持到2038年

10. 错误

(1) 错误的三种领域

  1. 语法错误 最常见,也最容易修复

    若文件中,有任意一行代码发生错误语法,name整个文件一行代码都不会执行

  2. 运行时错误 在代码的解析过程中,不合理,则报错.运行时错误

    比较常见 , 相对容易修复

    ​ 有些运行时错误,会终止程序的运行

    ​ 有些运行时错误,不会终止程序的运行

  3. 逻辑错误

    最麻烦的错误, 不会提示错误 也不会终止程序.

(2).错误级别

  • error 1 致命错误
  • wrning 2 警告错误,不会终止程序
  • norice 8 提示错误,不会终止程序

(3). 屏蔽错误

在开发测试中建议全部打开查看错误,在正是上线中,建议全部屏蔽提高用户体验度

  1. 屏蔽方式1:

    @ : 错误抑制符

    ​ 那边变量报错,就在那里加@ 仅限于小代码块范围使用

  2. 屏蔽方式2: 店长推荐 使用函数来屏蔽

error_reporting(0); 关闭错误报告
error_reporting(1); 显示错误报告
error_reporting(E_ALL); 显示所有的错误报告
error_reporting(E_ERROR); 只显示 error 错误报告
error_reporting(E_WARNING); 只显示 warning 错误报告
error_reporting(E_NOTICE); 只显示 notice 错误报告
error_reporting(E_ALL ^E_WARNING); 除了 warning 不报, 其余都报
error_reporting(E_ALL & ~E_WARNING); 除了 warning 不报, 其余都报
error_reporting(E_ALL ^E_NOTICE); 除了 warning 不报, 其余都报
error_reporting(E_ALL & ~E_NOTICE); 除了 notice 不报, 其余都报
  1. 屏蔽方式3:

    通过 ini_set() 临时改变"配置文件"

    ini_set('error_reporting', E_NOTICE);
    ini_set('error_reporting', 8);
    echo ini_get('error_reporting');
    
  2. 屏蔽方式4:

    前面的3个屏蔽方式, 仅仅限于本文件的错误屏蔽, 不能屏蔽其他文件的错误

    方式4: 通过直接 修改配置文件, 来屏蔽错误提示 (影响到整个服务器)

    1 配置文件地址: wamp/bin/apache/apachex.x.x/bin/php.ini
    2 修改配置1: error_reporting = 常量
    3 修改配置2: display_errors = On 开启错误提示 Off/关闭错误提示
    4 注意: 在修改任意配置, 需要重启服务器, 才能起作用

(4). 自定义报错

  1. trigger_error(报错信息, 错误类型)
    ​ E_USER_ERROR
    ​ E_USER_WARNING
    ​ E_USER_NOTICE
  2. 错误日志
    error_log(s1, s2, s3)
    • s1: 报错信息
    • s2: 消息类型 3: 将错误信息写入目标文件
    • s3: 目标文件
:
$a = 10;
$b = 0;

if($b == 0){
	$msg = '第二位参数不能为0 ';
	$type = E_USER_WARNING;
    
	$now = date('Y-m-d H:i:s');
	$timezone = date_default_timezone_get();
	$file = __FILE__;
	$line = __LINE__;
	// 在 txt文档中, 换行是通过 \r\n 来实现的
	$message = "[ {$now} {$timezone} ] PHP {$msg}  in {$file} on line {$line} \r\n \r\n";
	error_log($message, 3, './logs.txt');
	trigger_error($msg, $type);
}else{
	echo $a / $b;
}
echo '
'
;

(5). 逻辑错误

缩小错误范围:
​ 1. 断点法: 通过 die 来终止程序, 并输出之前的相关变量, 来判断是否有问题
​ 2. 注释法: 通过 注释 来屏蔽局部程序

11. 文件

(1) 文件属性: 常见分类

​ 1.file文件

​ 2.dir文件夹 目录.

(2) 文件分类

文件函数 功能 返回值
filetype( ’ 文件地址 ’ ) 获取文件类型 常见以file与dir居多,文件不存在时,返回false
filesize( ’ 文件地址 ’ ) 获取文件大小 文件的大小, 仅支持文件,不支持文件夹
file_exists( ’ 文件地址 ’ ) 判断文件是否存在 返回值 bool型
is_readable( ) 判断文件是否可读 返回值 bool型
is_writeable( ) 判断文件是否可写 返回值 bool型
filectime( ) 获取文件创建时间 可以设置date函数 设置返回的时间戳的格式
filemtime( ) 获取文件修改时间 可以设置date函数 设置返回的时间戳的格式
fileatime( ) 获取文件访问时间 可以设置date函数 设置返回的时间戳的格式

(3). 文件路径

​ 1.文件分隔符

​ window: 支持 / 也支持 \

​ Linux: 仅支持 /

​ 2.文件函数

文件函数 功能
DIRECTORY_SEPARATOR 获取当前系统支持的分隔符( 常量 )
dirname( ) 获取指定路径的目录
basename( ) 获取指定路径的文件名

(4)文件-目录-操作

函数名 功能
openddir( ) 打开目录,返回资源
readdir( ) 读取目录资源,读取完毕,返回false
closedir( ) 关闭资源
mkdir(目录地址,0777所有权限, true开启递归创建 ) 创建空目录
rmdir( 目录地址 ) 删除空目录
is_file( ) 判断是否为文件
is_dir( ) 判断是否为目录
copy(复制谁,复制到那里去 ) 复制文件
touch( 文件地址 ) 创建空文件
unlink( 文件地址 ) 删除文件
rename( 剪切谁, 剪切到哪里去 ) 剪切 / 重命名
  1. 打开目录( 文件夹 ) : 每一个目录都有 . 和 …

​ . 当前目录

​ … 上一级目录

​ 一般情况下,很少用,只有直接操作命令时,才会用得上,或者操作上下级目录时.

  1. 删除目录只能删除空目录

(5) . 文件加载

属性名 功能
include ’ 文件地址 ’ 文件加载 ( 加载地址出错 不会终止程序运行)
include ( ’ 文件地址 ’ ) 为了避免 文件重复加载 通过include_once 来加载
include_once ’ 文件地址 ’ 没有加载文件之前,无法使用文件中的变量
include_once( ’ 文件地址 ’ ) 支持相对路径 盘符路径, 不支持网址路径
require ‘文件地址’ 文件加载 ( 加载地址出错,立马终止程序运行) 支持相对路径 盘符路径, 不支持网址路径
require ( ’ 文件地址 ’ ) 同上~~~~
require_once ’ 文件地址 ’
require_once( ’ 文件地址 ’ )
  1. 为了避免重复加载 使用 _ once 来加载

  2. 在没有加载文件之前,无法使用文件中的变量

  3. 重复加载文件,就相当于将demo里面的代码复制一份

  4. 多次加载加载的文件之间没有关联

  5. include加载地址出错,立马终止程序运行

    require加载地址出错,不会终止程序运行

(6) 递归函数

1. 在函数内部调用自己 
2. 在执行后,最终会返回到最初的地方
3. 满足以上两点为递归函数

(7) 文件内容 文件操作

  1. 向文件赋予内容

    file_put_contents(文件路径,内容)

    例: file_put_contents(’./demo.txt’, ‘how are you?’);

  2. 向文件获取内容

    file_get_contents(文件路径)

    file_get_contents(’./demo.txt’);

  3. 面试题 请用一行代码获取百度首页

    file_get_contents(‘https://www.baidu.com’)

  4. 打开文件

    fopen('文件路径','打开方式')
    				r  读 read
    				文件指针指向开头
    				若文件不存在则报错
    				
    				w  写  write
    				会删除原由的所有内容
    				若文件不存在,则自动创建
    				
    				a  写 追加 append
    				文件指针指向末尾
    				若文件不存在则自动创建
    				
    				+ 增强模式
    				需要配合以上三种模式形成r+ W
    				+ a+ 将具备读和写的功能
    				
    				
    $handle = fopen('./demo.txt','r');
    返回值为资源
    
  5. 读取文件资源

    fread(资源,字节) 读取文件资源(指针形式)
    echo fread($handle,1);
    echo fread($handle,2);             会接着上一次读到的地方读下去
    echo fread($handle,filesize('./demo.txt'));
    读完所有
    
  6. 向文件资源写入内容

    指针指向最前 清除所有内容并写入

    fwrite(资源,内容)                 想文件写入内容
    $content = '我今天要在这里写点东西';
    fwrite($handle, $content);
    
  7. 追加内容,配合a方式

    指针指向末尾,从最后写入追加内容

    fwrite(资源,内容) 追加模式
    fwrite($handle, "I need a Mr.wang");
    
  8. 增强模式

    同时具备读写功能

    fwrite($handle,'刺激刺激,装完逼就跑');
    
  9. 关闭文件资源

    fclose(资源) 关闭资源
    fclose($handle);
    

(8) 接收上传内的文件

接收上传的文件(三道坎)

  1. 前端form, 设置MAX_FILE_SIZE 上传大小

  2. post协议(post_max_size), wamp限制: 8M以内

    一旦超过,$_FLIES ,则接收不到上传的文件

  3. 服务器限制(upload_max_filesize):2M以内

    一旦超过, error = 1 错误号

  4. 如果需要更大的上传限制,则修改配置文件php.ini

(9) 验证

  1. 判断error
  2. 判断是否从post协议传输
  3. 判断文件类型
  4. 设置新的文件名(唯一性)
  5. 设置存储目录
  6. 移动文件
1. 判断error
		$key = key($_FILES);
		if( empty($key) ){
			echo '您上传的文件过大, 换个小点的'; die;
		}

		$error = $_FILES[$key]['error'];

		if($error != 0){
			switch ($error) {
				case 1:	echo '您上传的文件过大, 换个小点的'; break;
				case 2:	echo '您上传的文件过大, 换个小点的'; break;
				case 3:	echo '请检查您的网络'; break;
				case 4:	echo '请上传您的文件'; break;
				case 6:	echo '服务器繁忙, 请稍后再试'; break;
				case 7:	echo '服务器繁忙, 请稍后再试'; break;
			}
			die;
		}

 2. 判断是否是从post协议传输
		// is_uploaded_file( 临时文件路径 )
		$tmp = $_FILES[$key]['tmp_name'];
		if( !is_uploaded_file($tmp)){
			echo '非法上传';
		}

3. 判断文件类型
		$type = $_FILES[$key]['type'];
		echo strtok($type, '/');
		echo strstr($type, '/');
		echo strstr($type, '/', true);
		echo strchr($type, '/');
		echo strchr($type, '/', true);
		// echo strrchr($type, '/');

		// $preg = '/  .* \/ /Ux';
		// preg_match($preg, $type, $result);
		// var_dump(rtrim($result[0],'/'));


		$type = strtok($_FILES[$key]['type'], '/');

		$allowType = ['image'];
		if ( !in_array($type, $allowType) ) {
			echo '您上传的格式有误'; die;
		}
	
4. 设置新的文件名 (唯一性)
		// 格式: 20190128xxxxxxxxxxxxxxxxxx.jpg
		// echo uniqid(); // 基于1微秒 产生一个唯一ID, 适合低频率

		$time = date('Ymd');
		$suffix = strrchr( $_FILES[$key]['name']  , '.');
		$newFile = $time.uniqid().$suffix;
		// echo $newFile;

5. 设置存储目录
		// upload/2019/01/28/
		$savePath = 'upload/'.date('/Y/m/d/');
		if ( !file_exists($savePath) ) {
			mkdir($savePath, 0777, true);
		}

6. 移动文件
		// move_uploaded_file( 临时文件,  新目录+新文件名)
		if ( move_uploaded_file($tmp, $savePath.$newFile)) {
			echo '上传成功'; die;
		}
		echo '上传失败';  die

(10) 高频率 uuid 设置唯一的id

UUID的好处: 能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响,保生成的ID不仅是表独立的 而且是库独立的,这点在数据库切分时 尤为重要.

function UUID(){
	$uuid = '';
	if (function_exists('uuid_create') === true){
	     $uuid = uuid_create(1);
	}else{
        $data = openssl_random_pseudo_bytes(16);
        $data[6] = chr(ord($data[6]) & 0x0f | 0x40); 
        $data[8] = chr(ord($data[8]) & 0x3f | 0x80); 
        $uuid =  vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
        }
        return $uuid;
}

for ($i=0; $i < 10000000; $i++) { 
    echo UUID().'
'
; }

(11) 文件下载

准备好前端html传输需要在的名字

//前端做好html a链接 链接php文件,传参get 名字想要下载的文件名
	1. 接收需要下载的名字
		$name = $_GET['name'];

	2. 准备下载路径
		$path = './download/'.$name;

	3.准备下载之后的名字(唯一性)
		$suffix = strrchr($name, '.');
	
		产生32位 随机16进制字符,以保证唯一性
		$filename = str_shuffle(str_shuffle(MD5(mt_rand().uniqid()))).$suffix;
			header('content-Disposition:attachment; filename="'.$filename.'"');


	4. 读取下载内容
		readfile($path);

12 .面向对象

(1) 对象

  1. 对象概念

    • 类: 抽象化 在定义功能
    • 对象: 实例化, 在调用功能
  2. 类和对象的关系

    • 类 就是对象的抽象化
    • 对象 就是累的实例化
  3. 定义类

    class 类名
    {
        成员属性(有什么)
        成员方法(会什么)
    }
    
  4. 创建对象

    对象变量 = new 类名

  5. 操作属性 或 方法

    • 条件限制: 必须要有对象才能操作

      • 对象->属性
      • 对象->方法名( )
      class plane{
          public $name = '波音747';
          public function fly()
          {
              echo '我会飞 
      '
      ; } } $a = new plane; echo $a->name; //输出 波音747 $a->fly();

(2) 伪对象 $this

  1. 伪对象 $this

    • 不需要声明,直接代表当前对象
    • 只能在 类内 使用
    • 一般用于类内操作属性 或 方法
  2. 伪对象使用方法 ---------- (以下内容与方法是在写 类的内部的!!! )

    • 方法1: var_dump($GLOBALS['name']);

    • 方法2:

      $b=new plane;
      var_dump($b);
      
      if($b == $GLOBALS['a']){
      	echo 'Yes';
      }else{
      	echo 'No';
      }
      
    • 方法3 :

      • echo $this->变量名(不用写$);
      • $this->类内部的方法名();

(3) 连贯操作 OOP

对象-> 方法1()->方法2()->方法3()

注意点; 在使用连贯操作的时候, 需要前面一个方法 返回一个对象. 用以调用后面的方法

所以要在方法1,方法2,…中return $this 只有这样才能够让后面的方法能够调用

个人总结: 1. 调用方法 强行接收 会收到**null**,

​ 2.在方法内**ruturn $this;可以返回当前对象(整个类)**

例:

class Person
		{
			public $name = '老王';
			public $age = 18;

			public function step1()
			{
				echo '黑虎掏心 
'
; var_dump($this); return $this; } public function step2() { echo '白虎掏阴
'
; } } $a = new Person; $a->step1()->step2()->step3(); //return $this 之后后面的方法才能在对象中调用方法

(4)魔术方法

魔术方法定义: 在触发特定的条件时, 自动调用魔术方法

  1. 构造方法 public function __construc(){...}

    • 触发条件: 实例化时,自动调用 (也就是new一个对象的时候自动调用)
    • 常用于: 初始化
    • 不需要返回值
      • 实例化时: 变量 会接收 对象
      • 调用时: 变量 接收 返回值
    • 位置: 写在属性的最后面, 方法的最前面
    • 在没有 构造方法时, 实例化的瞬间, 自动执行同类名的方法
      • 就是 方法名与 类名相同的情况下,在new实例化的瞬间会被执行.
      • 必须写在 属性的后面, 方法的最前面
    class Person
    	{
    		public $name;
    
    		public function __construct()
    		{
    			echo '这是一个构造方法 
    '
    ; return 123; } public function skill(){ echo '嘿嘿嘿'; } } $a = new Person; // 实例化对象, 自动调用构造方法;
  2. 析构方法 public function __destruct( ) { ... }

    • 触发条件: 在对象被销毁时,自动调用
    • 属于被销毁的几种情况
      • 程序自然结束时
      • 对象被覆盖时
      • 对象被删除时
    • 不能有参数
    • 位置: 写在方法的最后面
    • 例: 磊哥上课例子. 面试题…挺难的
    class Person
    	{
    		public function __construct()
    		{
    			static $a = 10;
    			echo $a;
    			$a++;
    		}
    
    		public function demo()
    		{
    			echo '老王客串一下';
    		}
    
    		public function __destruct()
    		{
    			static $b = 50;
    			echo $b;
    			$b++;
    		}
    	}
    
    	$x = new Person;
    	$x = new Person;
    	$x->demo();
    

(5) PDO 操作数据库 ( 数据库抽象层 )

  1. 链接数据库

    new PDO ( DNS, USER , PWD)

    • 参数
      • DSN :数据库:host=主机IP地址;dbname=库名;charset=编码
      • USER: 用户名
      • PWD: 密码
  2. 准备sql语句

    例: $sql = ' select * from user';

  3. 执行sql语句

    • PDO->query( sql语句 ) =====> 返回值: PDOStatement对象

      例: $res = $pdo->query(xql语句)

    • 通过 PDOStatement 获取数据

      • PDOStatement -> fetch ( 参数 ) 获取一条数据
      • PDOStatement -> fetchAll ( 参数 ) 获取所有数据
        • ​ 参数 : PDO::FETCH_ASSOC 关联
        • ​ PDO::FETCH_NUM 索引
        • ​ PDO::FETCH_BOTH 混合 (默认)
    $row = $res->fetchAll(PDO::FETCH_ASSOC);
    

你可能感兴趣的:(细说php入门学习)