php 服务器语言
访问方式
只能通过浏览器访问,访问地址**: lcoalhost**
代表访问本地服务器
PHP是什么?
超文本预处理器
一句话: 一种用来开发动态网站的服务器脚本语言
PHP文件
定界符
注释
// 单行
#单行
/* 多行 */
设置编码
PHP基本语法
每一条PHP命令均已分号结尾.发表该php命令结束其中,最后一条命令可以省略分号,推荐加上分号
php报错 不是当前行 就是上一行
含义: 变量理解为数学中的未知数
声明变量:
格式: $变量名=值
内存: 一旦申明一个变量,就会占用一定的内存
+ 当程序结束,没有人在引用变量时,就会被删除
+ 注意点: 若变量没有值,则被称之为未定义变量,该变量会报错.
变量命名规范
可变变量
$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改变
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( 变量) | 判断是否为资源 |
最大整型: PHP_INT_MAX 超过最大整型转为浮点型.
进制 | 基数 | 前缀 |
---|---|---|
二进制 | 0-1 | 0b |
八进制 | 0-7 | 0 |
十进制 | 0-9 | 无 |
十六进制 | 0-9 a-f | 0x |
进制转换:
任意进制—> 十进制:
基数 * 进制 ^ 次方
十进制—> 转任意进制
将十进制除以 任意进制, 结果到倒取余
浮点型:
小数
科学计数法 2e3 2e4 …3*10 的3次方…
浮点数不适合做运算
有效位数: 从前向后,第一个非0数字开头, 向后保留14位.
布尔型 bool 的值:
true 对,肯定.是,1,可以…
false 错,否认,否,0,不可以…
作用: 当运算不能直接表达, 一般会使用bool来表达状态
有 七种 值与false等价: |
---|
false |
0 |
0.0 |
‘’ , ‘0’ |
null |
空数组 |
未定义的变量 |
格式:
单双引号 : 单双引号的共同特性: ( 单双引号可以互插,不能自插. )
单引号:
不解析变量
不解析转义字符,但解析转义转义字符.
+ 转义符: \
+ 常见转义: \n 换行 \r 回车 \t 制表符 Tab
+ 转义 转义字符
+ \' 普通单引号
+ \" 普通双引号
+ \\ 普通斜杠
+ \$ 普通$符,不再有变量声明的意义了
heredoc结构
$a = <<<xxoo
输出多行文字或者什么的时候的是可以利用heredoc排版
xxoo;
定义: 容器,可以容纳任意数据
声明:
组成:
数组是由键和值 组成
数组的键: int 或者 string
键的别名: 偏移量 下标 索引
数组的值: 任意类型的值
操作数组:
一切皆对象
简单获取一个对象
$obj = new stdclass;
var_dump($obj);
任何文件都是资源
简单获取一个资源
fopen( 文件路径, 文件打开方式 r 只读 w写入)
在PHP中: 如果只是为了输出一句话
简化为
= 内容 ?>
三种常见函数 | 功能 | 返回值 |
---|---|---|
empty(变量 ) | 判断一个变量是否为空( 只要与false等价,都为空) | 空 => true // 非空 => false |
isset(变量 ) | 判断一个变量是否设置, (只有null 和 未定义变量是没有设置过的) |
设置 => true // 未设置=> false |
unset(变量 ) | 删除变量, 从而释放内存 | 返回值: 无 |
内存 注意点:
echo
print 或 print( )
支持int,float,string,resource的输出
print 语法结构
print( ) 函数
返回值: int
print_r( );
var_dump
小结:
print_r 适合大批量数据输出
var_dump 仅仅用于测试, 信息全面(文件地址,行高,数据类型,值,长度)
弱类型语言: 支持隐式转换
强类型语言: 不支持隐式转换
隐式转换: 偷偷将数据类型 进行转换
PHP 属于 弱类型语言
临时转换
只是暂时将变量类型转为其他类型,但本声不变.
运算符强制转换 | |
---|---|
(bool)$str | 布尔型 |
(int)$str | 整型 |
(float)$str | 浮点数 |
(string)$str | 字符串 |
(array)$str | 数组 |
(object)$str | 对象 |
函数强制转换 | |
intval($str) | 整型 |
floatval($str) | 浮点型 |
boolval($str) | 浮点型 |
strval($str) | 字符串 |
永久转换
settype ( 变量 , 类型 )
经常不变化的量,即为常量.
注意点:
格式: const 常量名 = 常量值
格式: define ( 常量名, 常量值 , bool ) bool值确认是否区分大小写.
预定义常量
预定义常量 | 功能 |
---|---|
PHP_INT_MAX | 最大整型数 |
M_PI | 圆周率 |
PHP_OS | 当前PHP所在系统 |
PHP_VERSION | 当前PHP版本 |
魔术常量
预定义常量 | |
---|---|
__DIR__ |
获取当前文件的所在目录 |
__FILE__ |
获取当前文件的盘符路径 |
__LINE__ |
获取当前行号 |
算数运算符
+ - * / %
加减乘除取余.
余数 % 除了求余之外,还有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环境 | 三元运算符:仅仅适合 做一些简单判断 |
(一). 顺序结构 : 代码从上往下依次执行
(二). 分支结构 : 通过 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
while( 条件表达式 ){
代码块
}
$i=0;
while($i<10){
echo $i;
$i++;
}
//输出 123456789
while 和dowhile的区别
doWhile循环
do{
代码块1
}while( 条件2 )
执行顺序 1 2 12 12
注意点: 如论条件是否成立至少会执行一次代码块
for循环
格式: for( 初始值1; 循环条件2; 循环增量3){
代码块4
}
执行顺序
1 243 243 243
当条件2 为假时,则结束循环
初始位置和增量位置 可以不写值
for($i=0; $i<10; $i++){
echo $i;
}
//输出 0123456789
以下所有写法,都是在html代码块中写的.
1.for 与 HTML 混合写法
for( ): ?>
html原生代码
endfor ?>
--------------------------------------
2.if 与 HTML 混合写法
if( ): ?>
html原生代码
endif(): ?>
--------------------------------------
if( ): ?>
html代码 true
else( ): ?>
html代码 false
endif ?>
----------------------------------
if( ): ?>
html原生代码 true
elseif( ): ?>
html原声代码 true
elseif( ): ?>
html原生代码 true
...
endif ?>
多重循环: 在循环中 嵌套循环
break
立马结束分支/循环,准备执行分支/循环外的代码
continue
立马结束当前一轮的循环,准备进行下一轮循环.
die /exit
立马结束程序,die之前的代码依旧执行
作用 : 用函数封装一些功能, 重复利用
函数分类:
自定义函数: ( 声明 )
格式:
function 函数名 ( 参数 ){
代码块
}
组成:
特性:
函数不调用不执行
函数一旦调用,name函数执行之后,会返回到调用函数的地方
小结:
功能相似, 位置相同 ,用 循环
功能相似, 位置不同, 用函数
调用函数:
函数名( )
函数名 ( 实参 )
命名规范
命名形式
驼峰命名法
从第二个单词开始,首字母大写
function addUserName( ){ }
帕斯卡命名法
每个单词首字母都大小 ( 大驼峰 )
function AddUserName( ){ }
下划线命名法
function add_user_name( ){ }
函数名不能重名
function var_dump(){ }
函数名不能重名包括系统函数和自定义的函数.
函数名要有意义
看到函数名 就大致能猜出是什么意思
多个单词组成的函数名: 动词 + 名词
getName( )
sendMsg( )
setInfo( )
关键字: return
无return: 当函数的代码块全部执行, 会自动返回到调用函数的地方,没有返回值(自然结束) 若强行接收返回值,则得到null
有return : 当函数的代码块执行到return时,则立马返回到函数调用的地方,返回return值(提前结束)
返回值的类型
可以返回任意类型
如何返回多个值
将多个值存入一个数组中,最终返回数组几个.
在外面通过数组一个一个取出
function demo3(){
$a = 10;
$b = 10.5;
$c = [$a, $b];
return $c;
}
形参: 在声明函数时给的参数 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;
}
变量作用域: 变量只能在指定的区域 起作用
全局变量: 在函数外部定义的变量
局部变量: 在函数内部定义的变量
注意:
默认情况下:
①. 全局变量 不能在局部环境中使用
②. 局部变量 不能在全局环境中使用
特殊情况下:
①. $GLOBALS[ 变量名 ]
可以在任意环境中使用, 该变量名 只能是全局环境中的变量
⑤. global 变量
该变量可以在函数外部直接使用
$a = 10; //全局变量
function demo1(){
global $b;
$b = 20; //局部变量
echo $GLOBALS['a'];
//通过 $GLOBALS[ 全局变量名 ] 即可在局部环境中使用 全局变量
}
demo1();
// 在全局环境中, 可以输出 global修饰的 局部变量
echo $b;
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.'
';
小技巧:
做任何功能, 考虑以下几点
1. 函数名
2. 参数
几个形参
形参要不要默认值
3. 核心功能
如果 核心需要 参数配合, 其余数值配合, 可以先做 模拟数据
4. 补充
缺什么参数, 补什么参数
缺什么值, 补什么值
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 = '' = 未定义变量
非法下标:
数组
对象
多维数组
在数组中, 值设为数组,即为多维数组
基本遍历方法: for while doWhile
指针遍历方式: foreach
指针遍历: 不需要考虑初始值, 不需要考虑增量, 不需要考虑条件
只能接受当前一轮的键 , 每一次循环, 都只能接收一个键或值
擅长遍历 非索引,非规律数字的数组
foreach( 数组名 as 键 => 值 ){
代码块
}
若只需要值, 不需要用键, 可以简化写法
foreach( 数组名 as 值 ){
代码块
}
函数名 | 功能 |
---|---|
current( ) | 获取当前指针所指向的值 |
key( ) | 获取当前指针所指向的键 |
next( ) | 将指针 下移一位 |
prev( ) | 将指针 上移一位 |
reset( ) | 将指针重置到第一位 |
end( ) | 将指针重置到最后第一位 |
each( ) | 获取当前指针的键和值, 且下移一位 |
一旦超出范围, 是无法通过next 或 prev 返回数组中
next 和 prev 相对性的 移动指针
解决方案: 通过 reset 或 end 回到数组中
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]);
/^[0-9]+abc$/
1.定界符 /
2.开始标志 ^
3.[0-9]原子
4.元字符
5.abc原子
可见原子:
unicode编码表中用键盘输出后肉眼可见的字符
不可见原子:
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次
常用于: 判断是否匹配成功
匹配全部函数
例:
只获取字符串中的所有汉字 \x{4e00} ~ \x{9fa5}
$preg = '/[\x{4e00}-\x{9fa5}]/u';
$total = preg_match_all($preg, $str, $result );
正则替换函数
例:
$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. **向后引用**: \1 后面\1 与 前面第一个( )匹配的值 一模一样
\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);
属性名 | 功能 |
---|---|
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年 |
语法错误 最常见,也最容易修复
若文件中,有任意一行代码发生错误语法,name整个文件一行代码都不会执行
运行时错误 在代码的解析过程中,不合理,则报错.运行时错误
比较常见 , 相对容易修复
有些运行时错误,会终止程序的运行
有些运行时错误,不会终止程序的运行
逻辑错误
最麻烦的错误, 不会提示错误 也不会终止程序.
在开发测试中建议全部打开查看错误,在正是上线中,建议全部屏蔽提高用户体验度
屏蔽方式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 注意: 在修改任意配置, 需要重启服务器, 才能起作用
例:
$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 '
';
缩小错误范围:
1. 断点法: 通过 die 来终止程序, 并输出之前的相关变量, 来判断是否有问题
2. 注释法: 通过 注释 来屏蔽局部程序
1.file文件
2.dir文件夹 目录.
文件函数 | 功能 | 返回值 |
---|---|---|
filetype( ’ 文件地址 ’ ) | 获取文件类型 | 常见以file与dir居多,文件不存在时,返回false |
filesize( ’ 文件地址 ’ ) | 获取文件大小 | 文件的大小, 仅支持文件,不支持文件夹 |
file_exists( ’ 文件地址 ’ ) | 判断文件是否存在 | 返回值 bool型 |
is_readable( ) | 判断文件是否可读 | 返回值 bool型 |
is_writeable( ) | 判断文件是否可写 | 返回值 bool型 |
filectime( ) | 获取文件创建时间 | 可以设置date函数 设置返回的时间戳的格式 |
filemtime( ) | 获取文件修改时间 | 可以设置date函数 设置返回的时间戳的格式 |
fileatime( ) | 获取文件访问时间 | 可以设置date函数 设置返回的时间戳的格式 |
1.文件分隔符
window: 支持 / 也支持 \
Linux: 仅支持 /
2.文件函数
文件函数 | 功能 |
---|---|
DIRECTORY_SEPARATOR | 获取当前系统支持的分隔符( 常量 ) |
dirname( ) | 获取指定路径的目录 |
basename( ) | 获取指定路径的文件名 |
函数名 | 功能 |
---|---|
openddir( ) | 打开目录,返回资源 |
readdir( ) | 读取目录资源,读取完毕,返回false |
closedir( ) | 关闭资源 |
mkdir(目录地址,0777所有权限, true开启递归创建 ) | 创建空目录 |
rmdir( 目录地址 ) | 删除空目录 |
is_file( ) | 判断是否为文件 |
is_dir( ) | 判断是否为目录 |
copy(复制谁,复制到那里去 ) | 复制文件 |
touch( 文件地址 ) | 创建空文件 |
unlink( 文件地址 ) | 删除文件 |
rename( 剪切谁, 剪切到哪里去 ) | 剪切 / 重命名 |
. 当前目录
… 上一级目录
一般情况下,很少用,只有直接操作命令时,才会用得上,或者操作上下级目录时.
属性名 | 功能 |
---|---|
include ’ 文件地址 ’ | 文件加载 ( 加载地址出错 不会终止程序运行) |
include ( ’ 文件地址 ’ ) | 为了避免 文件重复加载 通过include_once 来加载 |
include_once ’ 文件地址 ’ | 没有加载文件之前,无法使用文件中的变量 |
include_once( ’ 文件地址 ’ ) | 支持相对路径 盘符路径, 不支持网址路径 |
require ‘文件地址’ | 文件加载 ( 加载地址出错,立马终止程序运行) 支持相对路径 盘符路径, 不支持网址路径 |
require ( ’ 文件地址 ’ ) | 同上~~~~ |
require_once ’ 文件地址 ’ | |
require_once( ’ 文件地址 ’ ) |
为了避免重复加载 使用 _ once 来加载
在没有加载文件之前,无法使用文件中的变量
重复加载文件,就相当于将demo里面的代码复制一份
多次加载加载的文件之间没有关联
include加载地址出错,立马终止程序运行
require加载地址出错,不会终止程序运行
1. 在函数内部调用自己
2. 在执行后,最终会返回到最初的地方
3. 满足以上两点为递归函数
向文件赋予内容
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);
接收上传的文件(三道坎)
前端form, 设置MAX_FILE_SIZE
上传大小
post协议(post_max_size
), wamp限制: 8M以内
一旦超过,$_FLIES ,则接收不到上传的文件
服务器限制(upload_max_filesize
):2M以内
一旦超过, error = 1 错误号
如果需要更大的上传限制,则修改配置文件php.ini
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
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().'
';
}
准备好前端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);
对象概念
类和对象的关系
定义类
class 类名
{
成员属性(有什么)
成员方法(会什么)
}
创建对象
对象变量 = new 类名
操作属性 或 方法
条件限制: 必须要有对象才能操作
class plane{
public $name = '波音747';
public function fly()
{
echo '我会飞
';
}
}
$a = new plane;
echo $a->name; //输出 波音747
$a->fly();
伪对象 $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->类内部的方法名();
对象-> 方法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 之后后面的方法才能在对象中调用方法
魔术方法定义: 在触发特定的条件时, 自动调用魔术方法
构造方法 public function __construc(){...}
class Person
{
public $name;
public function __construct()
{
echo '这是一个构造方法
';
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();
链接数据库
new PDO ( DNS, USER , PWD)
数据库:host=主机IP地址;dbname=库名;charset=编码
准备sql语句
例: $sql = ' select * from user';
执行sql语句
PDO->query( sql语句 )
=====> 返回值: PDOStatement对象
例: $res = $pdo->query(xql语句)
通过 PDOStatement 获取数据
$row = $res->fetchAll(PDO::FETCH_ASSOC);