| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> PHP学习(5) -> 正文阅读 |
|
[PHP知识库]PHP学习(5) |
- 有关数学的函数max():指定参数中的最大值2 min():比较两个数中最小的值 rand():得到一个随机数,指定区间的随机整数 mt_rand():与rand一样,只是底层结构不一样,效率更高(建议使用) round():四舍五入 cell():向上取整【eg.1.1取2】 floor():向下取整 pow():求指定数字的指定指数次结果:pow(2,8)== 2^8 abs():绝对值 sqrt():求平方根 - 有关函数的函数function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高) func_get_arg():在自定义函数中去获取指定数值对应的参数 func_get_args():在自定义函数中获取所有参数(数组) fun_num_args():获取当前自定义函数的参数数量 - 错误处理错误处理:指的是系统(用户)在对某些代码执行的时候,发现有错误,就会通过错误处理的形式告知程序员 错误分类:(1).语法错误:用户书写的代码不符合PHP的语法规范,语法错误会导致代码在编译的过程中不通过,所以代码不会执行(Parse error) (2).运行时错误:代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误(runtime error) (3).逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但得不到想要的结果 错误代号:所有看到的错误代码在PHP中都被定义成了系统常量(可以直接使用) (1).系统错误: ????????E_PARSE:编译错误,代码不会执行? ????????E_ERROR:fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉) ????????E_WARNING:warning,警告错误不会影响代码执行,但是可能得到意想不到的结果 ????????E_NOTICE:notice,通知错误,不会影响代码执行 (2).用户错误:用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到) ????????E_USER_ERROR? ? ?E_USER_WARNING? ? ?E_USER_NOTICE (3).其他:代表着所有的错误,通常在进行错误控制的时候使用较多,建议在开发过程中 ????????E_ALL 所有以E开头的错误常量其实都由一个字节存储,然后每种错误占据一个对应的位,如果想进行错误的控制,可以使用位运算进行操作 排除通知级别notice:E_ALL & ~E_NOTICE 只要警告和通知:E_WARNING|E_NOTICE ? - 错误触发????????程序运行时触发:系统自动根据错误发生后,对比对应的错误信息,输出给用户,主要针对代码的语法错误和运行时错误 ?? ? ? ? 人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发响应的错误提示 Trigger_error(错误提示): (这个是让输出变汉字的)? 可以通过第二个参数进行严格性控制 ? - 错误显示设置?错误显示设置:那些错误该显示,以及如何显示 在PHP中其实有两种方式来设置当前脚本的错误处理 1.PHP的配置文件:全局配置:php.ini文件 display_errors:是否显示错误 error_reporting:显示什么级别的错误 2.可以在运行的PHP脚本中设置:在脚本中定义的配置项级别比配置文件高(通常在开发中通过代码来进行配置) error_reporting():设置对应的错误显示级别 ini_set(‘配置文件中的配置项’,配置值) ini_set(‘error_reporting’,E_ALL); ini_set(‘display_errors’,1); ? - 错误日志设置在实际生产环境中,不会直接让错误赤裸裸的展示给用户: 1.不友好 2.不安全:错误会暴露网站很多信息(路径、文件名) 所以在生产环境中一般不显示错误(错误也比较少),但是不可能避免会有错误(测试的时候不会发现所有问题),这个时候不希望看到,但是又希望捕捉到可以让后台程序员去修改,需要保存到日志文件,需要在PHP配置文件中或代码中(ini_set)设置对应的error_log配置项 1.开启日志功能 ?2.指定路径 ? - 自定义错误处理最简单的错误处理:trigger_errors()函数,但是该函数不会阻止系统报错 PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加到系统错误处理的句柄中,然后系统会在碰到错误后,使用用户定义的错误函数 1.用户自定义的函数放到系统中:set_error_handler() 2. 代码实现: 1.自定义错误处理函数:注意参数 2.注册自定义函数:修改错误处理机制 ?当前属于简单自定义模式,如果要复杂,可以在某些影响代码功能的错误发生后,让用户跳转到某个指定界面 ? - 字符串类型?字符串定义: 1.单引号字符串:单引号包裹 2.双引号字符串:双引号包裹 引号方式:适合定义比较短(不超过一行)或没有结构要求的字符串,有结构要求或者超过一行,用以下两种 3. nowdoc字符串:没有单引号的单引号字符串 $str = <<<'边界符' ? ? ? ? 字符串内容 边界符; 4.heredoc字符串:没有双引号的双引号字符串 $str = <<<边界符 ? ? ? ? 字符串内容 边界符; heredoc和nowdoc比引号的区别号是要多一点(多了结构): ? - 字符串转义转义:在计算机通用协议中,有一些特定的方式定义的字母,系统会特定处理:通常使用反斜杠+字母(单词)的特性: \r\n:回车换行 PHP在识别转义字符的时候也是使用同样的模式:反斜杠+字母 PHP中特定的转义符号: \':单引号字符串中显示单引号 \'':双引号字符串中显示双引号 \r:代表回车(理论上是回到当前行的首位置) \n:代表新一行 \t:类似tab键,输出4个空格 \$:在PHP中使用$符号作为变量符号因此需要特别指定 单引号和双引号的区别: 1.其中,单引号中只能识别\',而双引号中只是不能识别\' 2.双引号中可以识别$符号,所以双引号中可以解析变量,而单引号中不可以 ? ? ? ? 双引号中变量识别的规则: ? ? ? ? ? ? ? ? (1).变量本身系统能够与后面的内容区分:应该保证变量的独立性,不要让系统难以区分 ? ? ? ? ? ? ? ? (2).使用变量专业标识符(区分),给变量加上一组大括号{} 结构化定义字符串变量的规则: 1.结构化定义字符串对应的边界符有条件 ? ? ? ? 1.1上边界符后面不可以跟任何东西(包括注释、空格) ? ? ? ? 1.2下边界符必须顶格:最左边 ? ? ? ? 1.3下边界后面只能跟;不可以跟其他任何内容 2.结构化定义字符串的内部(边界符之间)的所有内容都是字符串本身【注释都会当成字符串输出】 ? - 字符串长度问题?(1).基本函数strlen():得到字符串的长度(字节为单位) ?(2).多字节字符串的长度问题:包含中文的长度 (3).多字节字符串扩展模块:mbstring扩展(mb:多字节) 首先需要加载PHP的mbstring扩展 ?可以使用mbstring带来很多扩展 mbstring扩展针对一些字符统计,会针对不同字符集;strlen只针对标准交换码ASCII;? ? - 字符串相关函数(1).转换函数: implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串 explode(分割字符,目标字符串):将字符串按照某个格式分割,变成数组 中国|北京|顺义 === array('中国','北京','顺义') str_split(字符串,字符长度):按照指定长度拆分字符串得到数组 (2).截取函数: trim(字符串,[指定字符]):本身默认是用来去除两边的空格(中间不行),但是也可以指定要去除的内容,是按照指定的内容循环去除两边有的内容,直到碰到不是目标字符为止? ltrim():去除左边的 rtrim():去除右边的 (3).截取函数: substr(字符串,起始位置从0开始,[长度]):指定位置开始截取字符串可以指定截取长度(不指定就截到最后) strstr(字符串,匹配字符):从指定位置开始截取到最后【可用来取文件后缀名】 (4).大小写转换函数: strtolower():全部小写 strtouper():全部大写 ucfirst():首字母大写【空格的大写还是空格】 (5).查找函数: strpos():判断字符在目标字符串中出现的位置(首次) strrpos():最后出现的位置 ?(6).替换函数: str_replace(匹配目标,替换的内容,字符串本身):将目标字符串中部分字符串进行替换 ?(7).格式化函数: printf / sprintf(输出字符串有占位符,顺序占位内容):格式化输出数据 ?(8).其他: str_repeat():重复某个字符串N次 str_shuffle():随机打乱字符串 ? - 数组的概念?数组:array,数据的组合,将一组数据(多个)存储到一个指定容器,用变量指向该容器,然后通过变量一次性得到该容器的所有数据 数组定义语法:在PHP中系统提供多种定义数组的方式: 1.使用array关键字:最常用 ? ? ? ? $变量 = array(变量1,变量2,变量3); ?2.可以使用中括号包裹数据 ? ? ? ? $变量 = [变量1,变量2]; ?3.隐形定义数组:给变量加一个中括号,系统自动变成数组 ? ? ? ? $变量[] = 值;? ? ? ? //如果比提供下标,系统自动生成(数字:从0开始) ? ? ? ? $变量[下标] = 值;? ? ? ? //中括号里面的叫下标:key,该下标可以是字母(单词)或数字,与变量命名规则相似 PHP数组特点 :(1).可以整数下标或者字符串下标 ? ? ? ? 如果数组下标都为整数:索引数组 ? ? ? ? 如果数组下标都为字符串:关联数组 (2).不同下标可以混合存在:混合数组 (3).数组元素的顺序以放入顺序为准,跟下标无关 ?(4).数字下标的自增长特性:从0开始自动增长,如果中间手动出现较大的,那么后面的自增长元素从最大的值+1开始 (5).特殊值下标的自动转换 ? ? ? ? 布尔:true和false ? ? ? ? 空:NULL (6).PHP中数组元素没有类型限制 (7).PHP中数组元素没有长度限制 补充:PHP中的数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存 ? - 多维数组?多维数组:数组里面的元素还是数组 二维数组:数组中所有元素都是一维数组 多维数组:?在第二维的数组元素中可以继续是数组,在PHP中没有维度限制(PHP本质并没有二维数组) 但是:不建议使用三维以上的数组,会增加访问的复杂度,降低访问效率 异形数组(不规则数组):数组中的元素不规则,有普通基本变量也有数组。 在实际开发中并不常用,尽量使数组规则化(便于访问) ? - 数组遍历遍历的基本含义数组遍历:普通数组数据的访问用到下标输出即可,如果数组中的数据所有都需要依次输出,就需要简化的规则来自动获取下标并输出数据 $arr?= array(0=>array('name'=>'Tom'),1=>array('name'=>'Jim'))? ? ? ? 二维数组 //访问一维元素:$arr[一维下标] ? ? ? ? $arr[0];? ? ? ? //结果:array('name'=>'Tom') //访问二维元素:$arr[一维下标][二维下标] ? ? ? ? $arr[1]['name'];? ? ? ? //结果:Jim foreach遍历语法:基本语法如下: foreach($数组变量 as [下标 => ] $值){ ? ? ? ? ? ? ? ? //通过$下标访问元素的下标,通过$值访问元素的值 } 通常如果是关联数组(字母下标),就需要下标,如果是数字下标直接访问值 获取下标: ? 在进行数据存储定义的时候,通常二维数组不会两个维度的key下标都为数字,一般是一维为数字(无意义),二维为字符串(数据库表字段),所以在进行遍历的时候,通常只需要针对一维遍历,得二维数组元素,然后二维数组元素通过下标去访问 foreach遍历原理:?本质是数组内部有一个指针。默认指向数组元素的第一个元素,foreach是利用指针去获取数据,同时移动指针 foreach($arr as $k => $v){ ? ? ? ? //循环体 } 1.foreach会重置指针,让指针指向第一个元素 2.进入foreach循环,通过指针取得当前第一个元素,然后将下标取出放到对应的下标变量中(如果存在),将值取出放到对应的值变量(指针下移) 3.进入循环内部(循环体)开始执行 4.重复2和3,直到2中指针取不到内容(指针指向数组最后) for循环遍历数组for循环:基于已知边界条件(起始和结束)然后有条件的变化(规律)【表达式1=>表达式2=>循环体=>表达式3=>表达式2...】 因此:for循环遍历数组有对应的条件 1.获取数组长度:count(数组)得到数组元素长度 2.要求数组元素的下标是规律的数字 【红线标出的是一步优化:不用每次运行都调用一下count函数了】 while配合each和list遍历数组 :while是在外部定义边界条件,要实现的话可以和for循环一样 each函数的使用:each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回 0下标 => 取得元素的下标值 1下标 => 取得元素的值 key下标 => 取得元素的下标值 value下标 => 取得元素的值 【蓝色的线代表指针下移了】? 如果each取不到结果(数组指针移动到最后),返回false list函数的使用:list是一种结构,不是一种函数(没有返回值) ,是list提供一堆变量去从一个数组中取得元素值,然后依次存放到变量中(批量为变量赋值,值来源于数组):list必须从索引数组中获取数据,而且必须从0开始 正确操作: ?错误操作:变量多于数组元素,没有指定从0到指定变量的下标的数组元素【second变量对应的下标为元素下标1的,但是数组没有】 ? 因此,list和each配合使用:each一定有两个元素0和1下标元素 list(变量1,变量2) = each(数组);? ? ? ? //是一种赋值运算,但是可以得到false结果(each取不到正确的结果),整个表达式为false ? ? - 数组相关的函数(1).排序函数:对数组元素进行排序,都是按照ASCII码进行比较,可以进行英文比较 ????????sort():顺序排序(下标重排) ????????rsort():逆序排序 ????????asort():顺序排序(下标保留) ????????arsort():逆序排序 ????????ksort():顺序排序,按照键名(下标) ????????krsort():逆序排序 ?????????shuffle():随机打乱数组元素【数组下标会重排】 ?(2).指针函数:自定义循环 ????????reset():重置指针,回到首位 ????????end():重置指针,到最后一个元素 ?????????next():指针下移,取得下一个元素的值 ????????prev():指针上移,取得上一个元素的值 ?????????current():获取当前指针对应的元素值 ????????key():获取当前指针对应的下标值 注意事项: next和prev会移动指针,使指针移动到最前或最后(离开数组),导致数组不能使用,通过next和prev不能回到正确的指针位置,只能通过end和reset进行指针重置 (3).其他函数: ????????count():统计数组中元素的数量 ????????array_push():往数组中加入一个元素(数组后面) ????????array_pop():从数组中取出一个元素(数组后面) ????????array_shift():从数组中取出一个元素(数组前面) ? ? ? ? array_unshift():往数组中加入一个元素(数组前面) PHP模拟数据结构: 栈:压栈,先进去后出来(FILO) 队列:排队,先进去的先出去(FIFO) ?? ? ? ? ?array_reverse():数组元素反过来 ?????????in_array():判断一个元素在数组中是否存在 ?????????array_keys():获取一个数组中所有下标,返回一个索引数组 ????????array-values():获取一个数组中所有值,返回一个索引数组 ? - 编程思想?编程思想:如何利用数学模式,来解决对应的需求问题,然后利用代码实现对应的数据模型(逻辑) 算法:使用代码实现对应的数学模型,从而解决对应的业务问题 递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论直至得到结果的算法,分为顺推和逆推两种 顺推:通过最简单的条件(已知),然后逐步推演结果 逆推:通过结果找到规律,然后推到已知条件 eg.斐波那契数列:1,1,2,3,5,8,13...,通常需求:求指定位置N所对应的值 找规律: 1.第一个数是1 2.第二个数也是1 3.从第三位开始,属于前两个数的和 代码解决思路: 1.如果数字位置为1和2,对应的值都是1 2.从第三位开始,想办法得到前两个的结果和,就可以得到 解决办法:想办法把要求的位置之前的所有值都列出来,那么要求的数就可以通过前两个之和求出来,使用数组存储所有数据即可 递推函数求斐波那契数列: ? 递归算法:递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(过程)来表示问题的解 1.简化问题:找到最优子问题(不能再小了) 2.函数自己调用自己 eg.斐波那契数列:1,1,2,3,5,8,13...,通常需求:求指定位置N所对应的值 规律同上: F(N) = F(N-1)+F(N-2) F(N-1) = F(N-2)+F(N-3) ... F(2) = F(1)=1 递归思想中有两个非常重要的点: 递归点: F(N) = F(N-1)+F(N-2) 递归出口:但问题解决的时候,已经到达(必须有)最优子问题,不能再次调用函数 如果一个函数调用自己而没有递归出口,就是死循环 递归的本质是函数调用函数:一个函数需要开辟一块内存空间,递归会出现同时调用N多个函数(自己):递归的本质利用空间换时间 ? - 数组排序算法冒泡排序:? 选择排序:?? 插入排序:?? ? 快速排序:? ? 归并排序:?? ? ?查找算法?:? ? |
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 4:42:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |