大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
文章目录
1. php基本语法
-
php 服务器语言
- 服务器: Apache服务器
- PHP文件: 存放wamp/www目录
-
访问方式
-
只能通过浏览器访问,访问地址**: lcoalhost**
-
代表访问本地服务器
-
-
PHP是什么?
-
超文本预处理器
-
一句话: 一种用来开发动态网站的服务器脚本语言
-
-
PHP文件
- 格式: ***.php
-
定界符
<?php php代码 ?>
-
注释
-
// 单行
-
#单行
-
/* 多行 */
-
-
设置编码
- header( ‘content-type: text/html; charset-编码 ‘)
-
PHP基本语法
-
每一条PHP命令均已分号结尾.发表该php命令结束其中,最后一条命令可以省略分号,推荐加上分号
-
php报错 不是当前行 就是上一行
-
2. 变量
-
含义: 变量理解为数学中的未知数
-
声明变量:
-
格式: $变量名=值
-
内存: 一旦申明一个变量,就会占用一定的内存
+ 当程序结束,没有人在引用变量时,就会被删除+ 注意点: 若变量没有值,则被称之为未定义变量,该变量会报错.
-
变量命名规范
- 有数字,字母和下划线组成
- 不能以数字开头
- 支持中文., 但不推荐
- 变量名要有意义
-
可变变量
- 将一个变量的值,作为另一个变量名来使用
$name = '山鸡'; $山鸡 = '乌鸡'; $乌鸡 = '呜呜呜'; echo $$$name; 则会输出 : 呜呜呜
-
引用变量值:
-
传值
$a = 100; $b = $a; $b = 200; echo $a,$b 这时,$a=100 $b=200; 传的是值所以$a不改变
-
传址 &
$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 |
进制转换:
-
任意进制—> 十进制:
基数 * 进制 ^ 次方 -
十进制—> 转任意进制
将十进制除以 任意进制, 结果到倒取余
(2). 浮点型 float
浮点型:
-
小数
-
科学计数法 2e3 2e4 …3*10 的3次方…
-
浮点数不适合做运算
-
有效位数: 从前向后,第一个非0数字开头, 向后保留14位.
(3). 布尔型 boolean
-
布尔型 bool 的值:
-
true 对,肯定.是,1,可以…
-
false 错,否认,否,0,不可以…
-
作用: 当运算不能直接表达, 一般会使用bool来表达状态
-
有 七种 值与false等价: |
---|
false |
0 |
0.0 |
‘’ , ‘0’ |
null |
空数组 |
未定义的变量 |
(4) 字符串 string
-
格式:
-
单双引号 : 单双引号的共同特性: ( 单双引号可以互插,不能自插. )
单引号:-
不解析变量
-
不解析转义字符,但解析转义转义字符.
+ 转义符: \ + 常见转义: \n 换行 \r 回车 \t 制表符 Tab + 转义 转义字符 + \' 普通单引号 + \" 普通双引号 + \\ 普通斜杠 + $ 普通$符,不再有变量声明的意义了
- 双引号:
- 解析变量 变量最好用{}包起来
- 解析转义字符
-
-
heredoc结构
$a = <<<xxoo 输出多行文字或者什么的时候的是可以利用heredoc排版 <table> <caption></caption> <tr></tr> </table> xxoo;
-
(5). 数组 array
-
定义: 容器,可以容纳任意数据
-
声明:
- 格式1: $变量名[ ] : 值
- 格式2: $变量名 = [ 值1, 值2 , …]
- 格式3: $变量名 = array(值1,值2,…)
-
组成:
-
数组是由键和值 组成
-
数组的键: int 或者 string
键的别名: 偏移量 下标 索引
-
数组的值: 任意类型的值
-
操作数组:
- 读取: 通过键来读取数组的值
- 修改: 通过已有的键 来修改数组的值
- 新增: 通过没有的键 来新增数组的值
- 删除: 通过unset( )函数来删除值
-
(7). 对象 boject
-
一切皆对象
-
简单获取一个对象
$obj = new stdclass;
var_dump($obj);
(8). 资源 resource
-
任何文件都是资源
-
简单获取一个资源
fopen( 文件路径, 文件打开方式 r 只读 w写入)
(9). 空null
- 什么都没有过,占有内存,但内存中没有具体内容
- 常用与占位
- echo 不能输出null
- 以下有三种情况直接null
- 直接赋值 null
- 未定义的变量
- 被删除的变量 nuset
4. 常见函数以及基本语法
(1). 三种常见函数
在PHP中: 如果只是为了输出一句话
<?php echo 内容 ?>
简化为 <?= 内容 ?>
三种常见函数 | 功能 | 返回值 |
---|---|---|
empty(变量 ) | 判断一个变量是否为空( 只要与false等价,都为空) | 空 => true // 非空 => false |
isset(变量 ) | 判断一个变量是否设置, (只有null 和 未定义变量是没有设置过的) |
设置 => true // 未设置=> false |
unset(变量 ) | 删除变量, 从而释放内存 | 返回值: 无 |
内存 注意点:
- 每定义一个变量,系统就会分配一个内存给变量
- 当内存没有被任何变量引用时,就会自动释放
- 函数: 一个函数没有返回值时, 强行接收, 则只会接收到null
(2). 四种常见输出
-
echo
- 支持intfloat, string, resource 的输出
- 属于 语法结构, 不是函数
-
print 或 print( )
-
支持int,float,string,resource的输出
-
print 语法结构
-
print( ) 函数
返回值: int
-
-
print_r( );
- 除了bool 和null 不能输出,其余都可以输出
- 函数,返回值:bool
- 输出理论无限制,实际受限于内存
-
var_dump
- 支持 任意类型
- 函数,返回值:无
- 输出有上限
小结:
print_r 适合大批量数据输出
var_dump 仅仅用于测试, 信息全面(文件地址,行高,数据类型,值,长度)
(3). 自动类型转换
-
弱类型语言: 支持隐式转换
-
强类型语言: 不支持隐式转换
-
隐式转换: 偷偷将数据类型 进行转换
-
PHP 属于 弱类型语言
(4) .强制类型转换
-
临时转换
只是暂时将变量类型转为其他类型,但本声不变.
运算符强制转换 (bool)$str 布尔型 (int)$str 整型 (float)$str 浮点数 (string)$str 字符串 (array)$str 数组 (object)$str 对象 函数强制转换 intval($str) 整型 floatval($str) 浮点型 boolval($str) 浮点型 strval($str) 字符串 -
永久转换
settype ( 变量 , 类型 )
(5) . 常量
-
经常不变化的量,即为常量.
-
注意点:
- 严格区分大小写,推荐大写
- 常量不能重新赋值
- 常量不能重新定义
-
格式: const 常量名 = 常量值
-
格式: define ( 常量名, 常量值 , bool ) bool值确认是否区分大小写.
-
预定义常量
预定义常量 功能 PHP_INT_MAX 最大整型数 M_PI 圆周率 PHP_OS 当前PHP所在系统 PHP_VERSION 当前PHP版本 -
魔术常量
预定义常量 __DIR__
获取当前文件的所在目录 __FILE__
获取当前文件的盘符路径 __LINE__
获取当前行号
(7). 运算符
-
算数运算符
-
+ - * / %
加减乘除取余. -
余数 % 除了求余之外,还有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 ); 10的1次方 2. 求任意数字的 最后两位 00 ~ 99 $a = 123; var_dump( $a % 100 ); 10的2次方 3. 求任意数字的 最后n为 %10的n次方
-
-
-
自增\自减
-
++ 变量a 自己给自己+1
a++ 先返回a 在给a+1
++a 先给a+1 在返回a -
– 变量自己给自己-1
a– 同上
–a 同上
-
字符串拼接
-
拼接符 . 小数点
-
主要用于:
- 字符串.变量
- 变量.字符串
- 变量.变量
-
-
单引号的速度 比 双引号的块
-
为了整个项目的运行速度考虑:
-
如果变量较少,推荐用单引号,变量用拼接
-
如果变量较多,使用双引号,变量用{} 包起来
-
赋值运算符
赋值运算符 含义 = 将 = 右边的 赋给 左边的 += a += b ==> a = a + b -= 同上 *= 同上 /= 同上 %= a .= b ==> a = a . b -
比较运算符
比较运算符 含义 注意点: 所有的比较结果: 都是bool值 > >= 大于 大于等于 < <= 小于 小于等于 == 判断两边的值是否相等 === 全等: 判断两边的值是否相等 且 数据类型相等 != 判断两边的值 是否不等 !== 不全等: 只有全等时为false, 其余都是true -
逻辑运算符
逻辑运算符 含义: 注意: 所有的逻辑运算符结果都是: bool值 逻辑与 && 两边为真即为真, 一边为假即为假 逻辑或 一边为真即为真, 两边为假即为假 逻辑非 ! 真即是假, 假即是真 -
三元运算符
三元运算符 ++ – ! …等 一元运算符 + – * / % …等 二元运算符 条件表达式 ? 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循环
-
格式: for( 初始值1; 循环条件2; 循环增量3){
代码块4
} -
执行顺序
1 243 243 243
当条件2 为假时,则结束循环 -
初始位置和增量位置 可以不写值
for($i=0; $i<10; $i++){
echo $i;
}
//输出 0123456789
5.混合写法:
以下所有写法,都是在html代码块中写的.
1.for 与 HTML 混合写法
<?php for( ): ?>
html原生代码
<?php endfor ?>
--------------------------------------
2.if 与 HTML 混合写法
<?php if( ): ?>
html原生代码
<?php endif(): ?>
--------------------------------------
<?php if( ): ?>
html代码 true
<?php else( ): ?>
html代码 false
<?php endif ?>
----------------------------------
<?php if( ): ?>
html原生代码 true
<?php elseif( ): ?>
html原声代码 true
<?php elseif( ): ?>
html原生代码 true
...
<?php endif ?>
6.多重循环
多重循环: 在循环中 嵌套循环
7.流程控制符
-
break
立马结束分支/循环,准备执行分支/循环外的代码
-
continue
立马结束当前一轮的循环,准备进行下一轮循环.
- for 碰到 cotinue,立马进入增量3
- while 碰到 continue,立马进入条件判断
-
die /exit
立马结束程序,die之前的代码依旧执行
- die ( 内容 )
- exit ( 内容 ) 在结束程序之前,在输出一次内容
6. 函数function
-
作用 : 用函数封装一些功能, 重复利用
-
函数分类:
- 系统函数: 数学,字符串,数组,其他函数等
- 自定义函数: 根据用户需求来封装函数
-
自定义函数: ( 声明 )
-
格式:
function 函数名 ( 参数 ){
代码块
}
-
组成:
- 关键字: function
- 函数名 : 要有意义 ( 动词+ 名词)
- ( ): 声明函数时的参数, 称之为形式参数, 简称形参
- { }: 函数体代码块, 函数功能具体代码
-
特性:
函数不调用不执行
函数一旦调用,name函数执行之后,会返回到调用函数的地方
-
小结:
功能相似, 位置相同 ,用 循环
功能相似, 位置不同, 用函数
-
调用函数:
函数名( )
函数名 ( 实参 )
-
(1).函数命名规范
-
命名规范
- 由数字,字母和下划线组成
- 不能以数字开头
- 不区分大小写
-
命名形式
-
驼峰命名法
从第二个单词开始,首字母大写
function addUserName( ){ }
-
帕斯卡命名法
每个单词首字母都大小 ( 大驼峰 )
function AddUserName( ){ }
-
下划线命名法
function add_user_name( ){ }
-
-
函数名不能重名
function var_dump(){ }
函数名不能重名包括系统函数和自定义的函数.
-
函数名要有意义
看到函数名 就大致能猜出是什么意思
多个单词组成的函数名: 动词 + 名词
getName( )
sendMsg( )
setInfo( )
(2) . 函数返回值
-
关键字: return
-
无return: 当函数的代码块全部执行, 会自动返回到调用函数的地方,没有返回值(自然结束) 若强行接收返回值,则得到null
有return : 当函数的代码块执行到return时,则立马返回到函数调用的地方,返回return值(提前结束)
-
返回值的类型
可以返回任意类型
-
如何返回多个值
将多个值存入一个数组中,最终返回数组几个.
在外面通过数组一个一个取出
function demo3(){ $a = 10; $b = 10.5; $c = [$a, $b]; return $c; }
(3). 参数
-
形参: 在声明函数时给的参数 parameter
-
实参: 在调用函数时给的参数 argument
-
参数个数差异会有何种不同
-
实参个数 = 形参个数 完美
-
实参个数 > 形参个数
多余的实参被抛弃,
形参已按照先来后到的原则进行接收
-
实参个数 < 形参个数
多余的形参: 1.被当成未定义的变量 会报错
2.采用默认值
-
实参个数不确定时???
计算器: 多个数字进行累加
形参 一个都不要写
通过几个函数来处理所有的实参
函数 功能 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). 变量作用域
变量作用域: 变量只能在指定的区域 起作用
-
全局变量: 在函数外部定义的变量
-
局部变量: 在函数内部定义的变量
注意:
默认情况下:
①. 全局变量 不能在局部环境中使用
②. 局部变量 不能在全局环境中使用 特殊情况下:
①. $GLOBALS[ 变量名 ]
可以在任意环境中使用, 该变量名 只能是全局环境中的变量 ⑤. global 变量
该变量可以在函数外部直接使用
$a = 10; //全局变量
function demo1(){
global $b;
$b = 20; //局部变量
echo $GLOBALS['a'];
//通过 $GLOBALS[ 全局变量名 ] 即可在局部环境中使用 全局变量
}
demo1();
// 在全局环境中, 可以输出 global修饰的 局部变量
echo $b;
(5). 静态变量
- 关键字 : static
- 定义: 在函数结束时,不会被删除,当下一次在调用次函数时,可以获取上一次静态变量值.
- 仅限于函数内部使用
function demo2(){
static $b = 50;
echo $b.' ';
$b++;
}
demo2(); 50
demo2(); 51
demo2(); 52...
(六). 函数技巧
变量技巧
可变变量: 将一个变量的值 作为另一个变量名 来使用
引用变量
函数技巧
可变函数: 将一个变量的值 作为函数名 来使用
引用函数: 通过 &符 将内存地址赋予
// 引用函数例:
function demo3(&$x){
$x++;
echo 'x = '.$x.'<br>';
}
$b = 20;
demo3($b);
echo 'b = '.$b.'<br>';
(6). 自定义函数
小技巧:
做任何功能, 考虑以下几点
1. 函数名
2. 参数
几个形参
形参要不要默认值
3. 核心功能
如果 核心需要 参数配合, 其余数值配合, 可以先做 模拟数据
4. 补充
缺什么参数, 补什么参数
缺什么值, 补什么值
7. 数组 array
(1).定义格式:
array(
键 => 值
key => value,
key => value,
...
key => value,
)
-
键: 只有int 或 string .
如果设置键为 float ,bool等其他类型,则会强制转为int 或string.
键的别名: 下标 偏移量 索引, index offset
-
值: 任何类型
-
分类
索引数组: 键为 int
关联数组 : 键为 string
-
格式:
$数组名[键] = 值
$数组名 = [ 键1=> 值1, 键2 => 值2 ,…]
$数组名 = array( 键1=> 值1, 键2 => 值2 ,…)
-
小结
true = 1 = 1.x //等价
false = 0 = 0.0 = '0' = 0.x
null = '' = 未定义变量
非法下标:
数组
对象
-
多维数组
在数组中, 值设为数组,即为多维数组
(2).遍历数组
-
基本遍历方法: for while doWhile
-
指针遍历方式: foreach
-
指针遍历: 不需要考虑初始值, 不需要考虑增量, 不需要考虑条件
只能接受当前一轮的键 , 每一次循环, 都只能接收一个键或值
擅长遍历 非索引,非规律数字的数组 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. 正则
- 正则表达式 含义 : 用某种模式去匹配字符串的一个公式
- 功能:由正规字符查询 替换操作
- 组成: 有正规字符和一些特殊字符构成
/^[0-9]+abc$/
1.定界符 /
2.开始标志 ^
3.[0-9]原子
4.元字符
5.abc原子
-
可见原子:
unicode编码表中用键盘输出后肉眼可见的字符
- 标点;“‘ _ ? . 等等
- 英文字母数字 a-z,A-Z,0-9
- 汉字、日文、阿拉伯文等其他语言文字
- Σ θ ∈ ≌ 等数理化公式符号
- 其他可见字符
-
不可见原子:
unicode编码表中用键盘输出后肉眼不可见的字符
- 换行, 回车,制表符,空格. 与其他不可见元素
-
元字符
| 元字符:
-
原子的筛选方式 | 匹配两个或者多个分支选择 [] 匹配方括号中任意一个原子 [^] 除了括号内的不可匹配,[]外匹配任意一个原子 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 匹配结果不区分大小写 -
单次匹配函数
preg_match( 正则, 对象, 结果) 结果是一个数组 返回每个匹配到的原子 返回值时1或者0
参数:
正则: 根据需求设计正则
对象: 将对象匹配正则
结果: 以数组形式接收 匹配的结果, 可省略返回值: 成功的匹配的次数
成功: 1次
失败: 0次常用于: 判断是否匹配成功
-
匹配全部函数
- preg_match_all( 正则, 对象 [,结果])
- 返回值: 匹配的次数
成功: >= 1
失败: = 0
例:
只获取字符串中的所有汉字 \x{
4e00} ~ \x{
9fa5}
$preg = '/[\x{4e00}-\x{9fa5}]/u';
$total = preg_match_all($preg, $str, $result );
-
正则替换函数
- 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;
-
正则函数 过滤 —- 向后引用
preg_grep( 正则, 数组 )
1. 过滤不符合正则规定的格式 2. **一般与向后引用一起使用** 3. **向后引用**: 后面 与 前面第一个( )匹配的值 一模一样 \num 后面\num 与 前面第num个( )匹配的值 一模一样
条件: 在使用\1 或 \2 或 \num 之前, 前面得要有 ( ) 小括号
注意: 在字符串中进行使用, 可以用 $1 或 $2 或 $num 来代替
-
( ) 单元模式
-
将( )内的内容当做一个整体, 作为一个大原子
( 这个大原子里面可能有好几个原子 但是看做一个原子了哦~~~)
-
( ) 内的内容送进 子模式组
-
注意点: **被小括号包起来后** ,**被匹配的值 会进入到接收结果的数组中.** 也就是**子模式组**
例: $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) 错误的三种领域
-
语法错误 最常见,也最容易修复
若文件中,有任意一行代码发生错误语法,name整个文件一行代码都不会执行
-
运行时错误 在代码的解析过程中,不合理,则报错.运行时错误
比较常见 , 相对容易修复
有些运行时错误,会终止程序的运行
有些运行时错误,不会终止程序的运行
-
逻辑错误
最麻烦的错误, 不会提示错误 也不会终止程序.
(2).错误级别
- error 1 致命错误
- wrning 2 警告错误,不会终止程序
- …
- norice 8 提示错误,不会终止程序
(3). 屏蔽错误
在开发测试中建议全部打开查看错误,在正是上线中,建议全部屏蔽提高用户体验度
-
屏蔽方式1:
@ : 错误抑制符
那边变量报错,就在那里加@ 仅限于小代码块范围使用
-
屏蔽方式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 不报, 其余都报 |
-
屏蔽方式3:
通过 ini_set() 临时改变”配置文件”
ini_set('error_reporting', E_NOTICE); ini_set('error_reporting', 8); echo ini_get('error_reporting');
-
屏蔽方式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). 自定义报错
- trigger_error(报错信息, 错误类型)
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE - 错误日志
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 '<hr>';
(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( 剪切谁, 剪切到哪里去 ) | 剪切 / 重命名 |
- 打开目录( 文件夹 ) : 每一个目录都有 . 和 …
. 当前目录
… 上一级目录
一般情况下,很少用,只有直接操作命令时,才会用得上,或者操作上下级目录时.
- 删除目录只能删除空目录
(5) . 文件加载
属性名 | 功能 |
---|---|
include ’ 文件地址 ’ | 文件加载 ( 加载地址出错 不会终止程序运行) |
include ( ’ 文件地址 ’ ) | 为了避免 文件重复加载 通过include_once 来加载 |
include_once ’ 文件地址 ’ | 没有加载文件之前,无法使用文件中的变量 |
include_once( ’ 文件地址 ’ ) | 支持相对路径 盘符路径, 不支持网址路径 |
require ‘文件地址’ | 文件加载 ( 加载地址出错,立马终止程序运行) 支持相对路径 盘符路径, 不支持网址路径 |
require ( ’ 文件地址 ’ ) | 同上~~~~ |
require_once ’ 文件地址 ’ | |
require_once( ’ 文件地址 ’ ) |
-
为了避免重复加载 使用 _ once 来加载
-
在没有加载文件之前,无法使用文件中的变量
-
重复加载文件,就相当于将demo里面的代码复制一份
-
多次加载加载的文件之间没有关联
-
include加载地址出错,立马终止程序运行
require加载地址出错,不会终止程序运行
(6) 递归函数
1. 在函数内部调用自己
2. 在执行后,最终会返回到最初的地方
3. 满足以上两点为递归函数
(7) 文件内容 文件操作
-
向文件赋予内容
file_put_contents(文件路径,内容)
例: file_put_contents(’./demo.txt’, ‘how are you?’);
-
向文件获取内容
file_get_contents(文件路径)
file_get_contents(’./demo.txt’);
-
面试题 请用一行代码获取百度首页
file_get_contents(‘https://www.baidu.com’)
-
打开文件
fopen('文件路径','打开方式') r 读 read 文件指针指向开头 若文件不存在则报错 w 写 write 会删除原由的所有内容 若文件不存在,则自动创建 a 写 追加 append 文件指针指向末尾 若文件不存在则自动创建 + 增强模式 需要配合以上三种模式形成r+ W + a+ 将具备读和写的功能 $handle = fopen('./demo.txt','r'); 返回值为资源
-
读取文件资源
fread(资源,字节) 读取文件资源(指针形式) echo fread($handle,1); echo fread($handle,2); 会接着上一次读到的地方读下去 echo fread($handle,filesize('./demo.txt')); 读完所有
-
向文件资源写入内容
指针指向最前 清除所有内容并写入
fwrite(资源,内容) 想文件写入内容 $content = '我今天要在这里写点东西'; fwrite($handle, $content);
-
追加内容,配合a方式
指针指向末尾,从最后写入追加内容
fwrite(资源,内容) 追加模式 fwrite($handle, "I need a Mr.wang");
-
增强模式
同时具备读写功能
fwrite($handle,'刺激刺激,装完逼就跑');
-
关闭文件资源
fclose(资源) 关闭资源 fclose($handle);
(8) 接收上传内的文件
接收上传的文件(三道坎)
-
前端form, 设置
MAX_FILE_SIZE
上传大小 -
post协议(
post_max_size
), wamp限制: 8M以内一旦超过,$_FLIES ,则接收不到上传的文件
-
服务器限制(
upload_max_filesize
):2M以内一旦超过, error = 1 错误号
-
如果需要更大的上传限制,则修改配置文件php.ini
(9) 验证
- 判断error
- 判断是否从post协议传输
- 判断文件类型
- 设置新的文件名(唯一性)
- 设置存储目录
- 移动文件
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().'<br>';
}
(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) 对象
-
对象概念
- 类: 抽象化 在定义功能
- 对象: 实例化, 在调用功能
-
类和对象的关系
- 类 就是对象的抽象化
- 对象 就是累的实例化
-
定义类
class 类名 { 成员属性(有什么) 成员方法(会什么) }
-
创建对象
对象变量 = new 类名
-
操作属性 或 方法
-
条件限制: 必须要有对象才能操作
- 对象->属性
- 对象->方法名( )
class plane{ public $name = '波音747'; public function fly() { echo '我会飞 <br>'; } } $a = new plane; echo $a->name; //输出 波音747 $a->fly();
-
(2) 伪对象 $this
-
伪对象 $this
- 不需要声明,直接代表当前对象
- 只能在 类内 使用
- 一般用于类内操作属性 或 方法
-
伪对象使用方法 ———- (以下内容与方法是在写 类的内部的!!! )
-
方法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 '黑虎掏心 <br>';
var_dump($this);
return $this;
}
public function step2()
{
echo '白虎掏阴 <br>';
}
}
$a = new Person;
$a->step1()->step2()->step3();
//return $this 之后后面的方法才能在对象中调用方法
(4)魔术方法
魔术方法定义: 在触发特定的条件时, 自动调用魔术方法
-
构造方法
public function __construc(){...}
- 触发条件: 实例化时,自动调用 (也就是new一个对象的时候自动调用)
- 常用于: 初始化
- 不需要返回值
- 实例化时: 变量 会接收 对象
- 调用时: 变量 接收 返回值
- 位置: 写在属性的最后面, 方法的最前面
- 在没有 构造方法时, 实例化的瞬间, 自动执行同类名的方法
- 就是 方法名与 类名相同的情况下,在new实例化的瞬间会被执行.
- 必须写在 属性的后面, 方法的最前面
class Person { public $name; public function __construct() { echo '这是一个构造方法 <br>'; return 123; } public function skill(){ echo '嘿嘿嘿'; } } $a = new Person; // 实例化对象, 自动调用构造方法;
-
析构方法
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 操作数据库 ( 数据库抽象层 )
-
链接数据库
new PDO ( DNS, USER , PWD)
- 参数
- DSN :
数据库:host=主机IP地址;dbname=库名;charset=编码
- USER: 用户名
- PWD: 密码
- DSN :
- 参数
-
准备sql语句
例:
$sql = ' select * from user';
-
执行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);
-
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/213454.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...