IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 11:40:17  更:2022-01-28 11:41:57 
 
开发: 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年6日历 -2024/6/2 8:59:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码