PHP 超文本预处理器(动态网站的脚本语言)
PHP是什么
PHP: 超文本预处理器一句话: 一种用来开发动态网站的服务器脚本语言 1. PHP 定界符 所有PHP代码必须放在定界符里才能起作用 定界符1: <?php php代码 ?> 长风格定界符 定界符2: <? php代码 ?> 短风格定界符 PS: 短风格定界符, 服务器默认不开启 如需开启, 需要修改配置文件 配置文件地址: wamp\bin\apache\apache2.4.18\bin\php.ini 配置代码: short_open_tag = On | Off 修改任意配置, 必须重启服务器才能起作用. 2. PHP 向浏览器输出一句话 echo '内容'; PS: 内容可以识别 html标签 3. 如果输出内容乱码, 则先声明编码方式 header('content-type: text/html; charset=utf-8'); utf-8编码 4. 注释 单行: // ``` 单行: # 多行: /* * / ``` 5. 基本语法 每条PHP命令 均以 分号 结尾; 其中, 最后一条PHP命令, 可以省略分号. (不推荐)
变量
变量 variable 未知数 值不固定 1. 格式 $变量名 = 值 PS: 如果变量 没有赋值, 则被称之为 未定义的变量 echo @$y; // Undefined : 未定义 如果不想看见错误, 在变量前面加@ 2. 命名 2.1 规范: 由数字, 字母和 下划线组成, 不能以数字开头 支持中文, 最好不要用中文. 2.2 区分大小写 3. 可变变量: 将一个变量的值 作为另一个变量的名 去使用 普通赋值 • $a = 100; 引用变量: 将一个变量的内存地址 给了 另一个变量 • $a = 100; • $b = &$a; // $b = $a的内存地址, 两个变量共用同一个内存
数据类型
数据类型 • 标量 • 整型 int • 浮点型 float • 布尔型 bool • 字符串 string • 复合 • 数组 array • 对象 object • 特殊 • 资源 resource • 空 null
整型 int
**最大整型** • var_dump( PHP_INT_MAX ); • echo '<br> '; • $a = PHP_INT_MAX; • $a = $ a + 1; • var_dump( $a ); • PS : **超过最大整型, 则自动转换为 浮点型** • 进制数 => 十进制 • 二进制: 0-1 **以0b开头** • 八进制: 0-7 **以0开头** • 十进制: • 十六进制: 0-9 a-f **以0x开头**
浮点型 float 小数
var_dump( 1.5 ); • var_dump( 15 ); 精度 14位 四舍五入 • 科学计数法 • $a = 2e3; // 2 * 10^3 • echo $a; • var_dump($a); • 奇葩现象 **浮点型不适合二进制**
布尔型 bool 状态
值: true | false • 场景: 用于 判断 • var_dump( 1 > 2 ); • **有7种情况与false 等价, 其余都是true** 1. false 2. 0 3. 0.0 4. '' 或 '0' 5. null 6. 空数组 array() 或 [] 7. 未定义变量
字符串 string
-
**单引号 推荐** - **双引号** - **自定义定界符 <<<定界符 定界符;** 单双引号的区别 **单: 不解析变量, 不解析转义字符, 但解析转义转义字符** **双: 解析变量, 解析转义字符** **共: 不能自插, 可以互插**
数组
**组成: 下标 和 值** • 格式: • $数组名[] = 值 • $数组名 = [值1, 值2, ...] • $数组名 = array(值1, 值2, ...) • 增删改查, 通过 下标 来实现
对象
*类和对象* **类 就是对象的抽象画** **对象 就是类的实例化** *类* class 类名 { 属性 格式: 修饰符 属性名 修饰符 属性名 = 属性值 方法 格式: 修饰符 function 方法名 (参数) { 方法体 } } 对象 实例化格式: 对象 = **new 类名** 通过对象使用属性 **对象->属性名** 通过对象使用方法 **对象->方法名()** 伪对象 在类内,通过 **$this** 来访问属性/方法 连贯操作 **$对象名->方法名( )->方法名( )..........** PS: 每个方法需要返回对象(**return对象名**)
资源
资源数据类型是PHP4引进的。资源是一种特殊的变量类型,保存了 到外部资源的一个引用:如打开文件、数据库连接、图形画布区域等。 资源是通过专门的函数来建立和使用的 资源在PHP变量中使用 例: $资源 = fopen('文件地址', '模式')
空
定义: 没有内存地址 3种情况直接为null 直接赋值 未定义变量 被删除的变量
常见函数
unset() 删除变量 empty() 判断一个变量是否为假 假 返回true, 真 返回false isset() 判断一个变量是否有内存地址 有 返回true, 没有 返回false 只有null 和 未定义变量 返回false **常量** 格式: const 常量名 = 常量值 格式: define(常量名, 常量值 [,true/false]) true: 不区分大小写 false: 区分大小写 默认 - 常量名不需要$符 - 常量区分大小写 - 常量不能重新赋值 - 常量不能重新定义 魔术常量 __FILE__ 盘符路径 __LINE__ 行号 预定义常量 PHP_INT_MAX 最大整数 PHP_OS 操作系统 PHP_VERSION 版本 M_PI 圆周率
PHP输出方式
**echo** 支持int, float, string, resource 语法结构 没有返回值 **print | print()** 支持int, float, string, resource 语法结构 | 函数 返回值: int **print_r** 除了bool和null, 其余的都能输出 函数 返回值: bool var_dump **任意类型** 函数 没有返回值 var_dump: 128个 more elements ... print_r: 无上限
PHP类型转换
**自动类型** bool -> int true : 1 | false :0 -> float int -> float string -> int -> float 从前向后数, 当碰到第一个不是数字时(. 和 e), 截断(后面不要了) '123abc' + 100 123 + 100 'abc123' + 100 0 + 100 'a1b2' + 100 0 + 100 '1b2a' + 100 1 + 100 '1.2e3' + 100 1.2*10^3 + 100 '1.2.3e4' + 100 1.2 + 100 '1eee3' + 100 1 + 100 **强制类型** **临时** 通过运算符 来转换 (类型)变量 PS: 类型不支持特殊类型 通过函数 来转换 intval() floatval() boolval() strval() **永久** 通过函数 来转换 settype(变量, 类型)
运算符
**算术运算符** + - * / 加减乘除 % 取模 ++ a++ ++a 自增自减 . 拼接 **. 赋值运算符** = += -= *= a *= b => a = a * b /= %= .= **比较运算符** = < = >= === != <> !==
逻辑运算符
逻辑与 && and 两边为真即为真, 一边为假即为假 • 逻辑或 || or 两边为假即为假, 一边为真即为真 • 逻辑非 ! 真即是假, 假即是真 • • PS: 如果前面的运算已经确定最终结果, 那么后面的代码不再执行 • PS: 与和或同时发生时, 从左往右运算 • 一元运算符 ++ -- ! (类型) • 二元运算符 + - * / .... • 三元运算符 ?: 完整格式 条件表达式 ? 成立 : 不成立 • $a = 2; • $a = 3; • echo $a == 2? '是2啊' : '不2啊'; • echo '<hr>'; 条件 ? ( ?: ) : ( ?: ) • $lv = 9.2; • echo $青铜lv < 6? '青铜' : ( $lv < 7 ?'白银': ($铂金lv < 8?'铂金': ($lv < 9?'钻石':'王者')) ) ; • echo '<hr>'; • get 服务器以 $_GET 接收 • post 服务器以 $_POST 接收 • var_dump( $_GET ); • $xxx = $ _GET['ope']; • echo $xxx;
流程控制
顺序结构: 代码从上往下依次执行 分支结构: 通过if/switch进行 分支选择 循环结构: 通过 while/ do_while/ for 循环 **if 分支** 3.1 if() 影响紧跟在if后面的一句话 3.2 if(){} 影响在if后面的{}内的所有代码 3.3 if(){ true环境 }else{ false环境 } 3.4 if(){ true环境 }elseif(){ 二次true环境 }else{ 二次false环境 } if用于定值, 用于范围判断 **switch 定值分支** switch(标志){ case '标志1': case '标志2': ... case '标志N': default: 以上标志都不存在时, 才会进入default } 每个case, 默认从上往下依次执行, 如果只想执行某一个case, 在每个case的最后加 break;
循环
while while( 条件表达式 ){ 循环体 } do_while do{ 循环体 }while( 条件表达式 ) for for( 1-初始值 ; 2-循环条件 ; 3-循环增量 ){ 4-循环体 } 1 2 4 3 2 4 3 2 4 3.. 2 = false 时, 则跳出循环 特殊流程控制符 continue 直接进入下一轮 break 结束当前的循环 die | exit 结束程序
PHP与HTML混合写法
<?php for(): ?> **html代码** <?php endfor ?> <?php if(): ?> **html代码** <?php endif ?> <?php if(): ?> **true环境**下的html代码 <?php else: ?> **false环境**下的html代码 <?php endif ?> <?php if(): ?> **true环境**下的html代码 <?php elseif: ?> **二次true环境**下的html代码 <?php else: ?> **二次false环境**下的html代码 <?php endif ?>
PHP函数
系统函数: 自定义函数: 根据用户的需求来设计函数 格式: function 函数名( [参数1, 参数2, ...] ) { 函数体 } 调用函数 函数名() 函数名( [参数, 参数, ...] ) 函数特性 不调用不执行, 语法照常解析 函数互不影响, 可以互相调用 函数位置 和 调用函数位置 前后无所谓 函数名 规范: 由数字, 字母和下划线组成 不能以数字开头 不区分大小写 不能重复 形式: 驼峰命名法 myCodetext 帕斯卡命名法 MyCodeText 下划线命名法 my_code_text 返回值 **return** 当函数执行到return时, 立马结束函数. 并返回到调用函数的地方 自然结束: 没有return时, 默认有null 通过return返回: 可以返回任意类型 如何返回多个值, 通过数组返回 **参数** 分类: 实参: 调用函数时给的参数 形参: 定义函数时给的参数 实参个数 = 形参个数: 完美 实参个数 > 形参个数: 多余的实参被抛弃 实参个数 < 形参个数: 多余的形参, 要么当成未定义变量 要么采用默认值 **实参个数不确定时:** **func_get_args()** 以数组形式, 接收所有的实参 **func_get_arg(n)** 获取实参列表中下标为n的值 **func_num_args()** 获取实参的总个数 **作用域** 全局变量: 在函数外部定义的变量, 默认不能在局部环境中使用 局部变量: 在函数内部定义的变量, 默认不能在全局环境中使用 全局变量 在局部环境中使用, 通过$GLOBALS['全局变量名']使用 局部变量 在全局环境中使用, 通过global声明局部变量 静态变量: 在函数结束时, 不会消失,当再次调用此函数时, 会直接使用 上一次的静态值 **变量技巧** 可变函数: 将一个变量的值 作为函数名来使用 引用函数: 形参接收实参的内存地址
PHP数组
分类: 索引数组: 下标为 int 关联数组: 下标为 string 格式1: $数组名[ 下标 ] = 值 格式2: $数组名 = [ 下标=>值, 下标=>值, ...]; 格式3: $数组名 = array( 下标=>值, 下标=>值, ... ) 数组下标 下标 / 键 / 偏移量 索引键: 完全没有下标时, 默认从0开始, 已经存在下标时, 默认从已有的最大下标+1 关联键: **true** = 1 = 1.0 = '1' **fals**e = 0 = 0.0 = '0' **null** = '' = 未定义变量 **不能为 数组/对象/资源** **数组值** **值: 任意类型** **值 = 数组, 称之为: 多维数组** 数组**遍历** 索引遍历: 适合 有规律的数字下标 指针遍历: 不需要初始值, 不需要增量 **数组指针** current() 返回当前指针所在的值 next() 下移一位 prev() 上移一位 reset() 重置到第一位 end() 重置到最后一位 key() 返回当前指针所在的键 each() 返回当前指针所指向的键和值 **循环** **foreach( 数组名 as [ 键 => ] 值 ){** 循环体 **}* **预定义数组** 预定义数组 $GLOBALS $_SERVER HTTP_HOST 主机名 HTTP_REFERER 上一级来源地址 HTTP_USER_AGENT 浏览器版本 SERVER_NAME 服务器名 SERVER_ADDR 服务器IP地址 SERVER_SOFTWARE 服务器环境 REMOTE_ADDR 客户端IP地址 SCRIPT_FILENAME 脚本地址(盘符) SCRIPT_NAME 脚本地址(网址) REQUEST_URI 传输地址(带参数) REQUEST_METHOD 传输方式 QUERY_STRING 传输参数 $_GET $_POST 当action属性带参数, method = post, $接收参数_GET 接收参数, $_POST接收表单值 method = get, $_GET 接收表单, 而参数丢失 解决方案: 将参数通过隐藏域传输 $_COOKIE $_SESSION $_FILES file表单name名 form表单enctype = multipart/form-data form表单method = post $_REQUEST : 接收 get, post, cookie的值 **字符串 -> 数组** 字符串当成 索引数组, 第一个字符的下标为 0, 依次类推 字符的下标如果超出 字符串长度时, 返回 空字符串
正则
**定界符** // # {} **原子** 可见原子 : 输出之后肉眼可见的字符 不可见原子 : 输出之后肉眼看不见的字符 **元字符** 筛选方式 | : 匹配两个或多个分支选择 [] : 匹配里面任意一个原子 \\\[^ ]: 匹配除中括号以外的任意一个原子 **集合** \d : 匹配任意一个数字 0-9 \D : 匹配除数字以外的任意一个字符 \s : 匹配任意一个不可见原子 \S : 匹配任意一个可见原子 \w : 匹配任意一个数字, 字母和下划线 \W : 匹配除数字, 字母和下划线以外的任意一个字符 . : 匹配除换行符以外的任意一个字符 **量词** {n} : 匹配其前面的一个原子恰好n次 {n,}: 匹配其前面的一个原子至少n次 {n,m}: 匹配其前面的一个原子至少n次, 最多m次 : 0次, 1次或多次 ? : 0次或1次 + : 1次或多次 **边界控制** ^ : 以某个原子为开始 $ : 以某个原子为结尾 模式单元 ( ) : 整体为一个原子 模式选择 ( | ): 分隔多选一 **模式修正符** U 贪婪/懒惰 贪婪 .* 匹配结果存在歧义时, 取其长 懒惰 .*? 匹配结果存在歧义时, 去其短 x 忽略空白 忽略正则的空白 i 不区分大小写 不区分正则的大小写 **正则函数** preg_match(正则, 对象 [, 结果]) 返回值: 成功匹配的次数 **正则替换** preg_replace(正则, 替换值, 对象) 返回值: 替换后的对象 **正则过滤** preg_grep(正则, 数组) 返回值: 过滤之后的数组 **正则分组** 模式单元: 子模式匹配 后向引用: \1: 将第一个() 的值 重复到\1的位置 \2: 将第二个() 的值 重复到\2的位置 ... 取消子模式匹配: (?: )
PHP时间
**时间戳** time() 1970-现在的秒数 **格式化时间** date(日期格式[, 时间戳]) 返回值: 格式化之后的时间 **时区** date_default_timezone_set('时区') **PRC 中国** **Asia 亚洲** UTC 世界标准时间 date_default_timezone_get() **创建时间** mktime(时, 分, 秒, 月, 日, 年) 返回值: 时间戳 **字符串转时间** strtotime() 返回值: 时间戳 ## **微秒** microtime() microtime(true)
错误机制
**错误领域** 语法错误 运行时错误 逻辑错误 **错误级别** error 致命错误 warning 警告错误 notice 提示错误 **预定义数组** $GLOBALS $_GET $_POST $_SERVER $_COOKIE $_SESSION $_FILES $_REQUEST **屏蔽错误 (临时性)** 给错误变量前面加 @ 通过 函数error_reporting 来屏蔽 **屏蔽错误 (配置)** display_errors = On | Off error_reporting = ... ini_set() ini_get() **自定义错误** trigger_error(错误信息, 错误类型) E_USER_ERROR E_USER_WARNING E_USER_NOTICE自定义错误 trigger_error(错误信息, 错误类型) E_USER_ERROR E_USER_WARNING E_USER_NOTICE **错误日志** error_log(错误信息, 消息类型, 目标文件) 将错误信息存入 目标文件中 **逻辑错误** 既不报错, 又不终止程序, 结果还是错误 排除方法: 断点法 在怀疑的变量后面加 die, 并输出查询 注释法 适合于前端
PHP文件
**文件属性** • filetype() 文件类型 • filesize() 文件大小 • file_exists() 文件是否存在 • filectime() 创建的时间 • filemtime() 修改的时间 • fileatime() 访问的时间 • is_readable() 是否可读 • is_writeable() 是否可写 • **文件路径** • dirname() 获取目录 • basename() 获取文件名 • parse_url() 解析url地址 • pathinfo() 解析盘符地址 • **递归函数** • opendir() 打开目录, 返回资源 • readdir() 读取资源, 返回资源名 • closedir() 关闭资源 • is_file() 是否为文件 • is_dir() 是否为目录 • 1 打开目录 • 2 读取资源 • 2.1 排除. 和 .. • 2.2 凑完整路径 • 2.3 判断是否为文件 • 2.4 判断是否为目录 • 3 关闭资源 • **目录操作** • mkdir() 建 • rmdir() 删 • opendir() • readdir() • closedir() • is_dir() • dirname() • file_exists() • filetype() • **文件操作** • filetype() • filesize() • is_file() • filectime() • filemtime() • fileatime() • touch() • unlink() • is_readable() • is_writeable() • basename() • rename() • copy() • fopen() 返回资源 • fread(资源, 大小) • fwrite(资源, 内容) • fclose() • file_exists() • **文件加载** • include • 格式 include '文件路径' • include('文件路径') • include_once '文件路径' • include_once('文件路径') • 什么时候执行到include , 才会去加载 • 可以重复加载. 只加载一次通过 include_once 实现 • 如果加载失败, 不会终止程序 • require • 格式 require '文件路径' require('文件路径') • require_once '文件路径' require_once('文件路径') • 什么时候执行到require , 才会去加载 • 可以重复加载. 只加载一次通过 require_once 实现 • 如果加载失败, 会终止程序 • **文件内容** • file_put_contents(文件路径, 内容) • file_get_contents(文件路径) • • **上传文件** • **上传文件的三个必要条件** • file表单的name • form表单的enctype = multipart/form-data • form表单的method = post • **大小限制** • 表单 MAX_FILE_SIZE 自定义 • post限制 post_max_size = 8M 如果超出post限 制, $_FILES接收不到值 • 服务器限制 upload_max_filesize = 2M • **判断是否从post协议传输** • is_uploaded_file() • **判断文件的类型** • 获取文件类型 • 准备允许类型 • 判断 获取文件类型 是否属于 允许类型 • *** 设置唯一的文件名** • 获取文件的扩展名 • 设置唯一的文件名 uniqid() • *** 设置唯一的文件名** • 获取文件的扩展名 • 设置唯一的文件名 uniqid() #### 设置存储目录 • 设置存储目录 • 设计存储目录 • 判断存储目录是否存在 • mkdir(目录路径, 权限 0777, 递归创建 true) #### 移动临时文件到存储目录 • 移动临时文件 到 存储目录 • move_uploaded_file( 临时文件, 目录+文件名 ) • **多文件上传** • 多文件上传 • file表单 加属性 multiple • name名 加[] #### 文件下载 • header('content-Disposition:attachment; • filename=下载名'); • readfile(下载路径)