PHP基础学习(1)

1.Web 网站

1.静态网站访问原理

image-20201217213410089

2.动态网站访问原理

image-20201217214127378

2.Apache

1.软件的安装

  1. 获取 Apache 安装软件;

  2. 双击进行安装;

  3. 选择安装模式;

    image-20201217221005492
  4. 选择安装地址

    • 自定义安装位置(尽量不要安装在 C 盘里面);

2.Httpd.exe 的详细应用

  1. 服务器进程:运行之后才可以工作;
image-20201217222320713
  1. 用来查看 Apache 具有哪些功能以及配置文件是否出现错误;httpd 或者 httpd.exe 文件所在目录;

    • 2.1 查看使用的模块 httpd -M

      image-20201217223206224
    • 2.2 验证配置文件是否有效:httpd -t

      image-20201217223435550

3.配置默认站点

  1. 让 Apache 确定服务器上访问的位置:网站文件夹所在位置;

    Httpd-------> conf ---->DocumentRoot(文件的根目录)----------->DocumentRoot;

    image-20201217224931664
  2. 方便用户使用名字访问对应的网站:给文件夹对应的取一个别名;

    Httpd-------> conf ---->DocumentRoot(文件的根目录)------>serverName;

    image-20201217225133730

    2.1. 解开注释,痛死可以把端口给去掉,因为端口可以单独的设置;

    conf文件里面有一个 listen 可以实现监听端口的变化

  3. 凡是涉及到 Apache 配置文件的修改,都需要重新启动 Apache 服务器才可以生效

  4. 实现 DNS 域名解析:通常默认站点都是本地 DNS:hosts 文件;

    C:\Windows\System32\drivers\etc\hosts在文件里面添加代码 127.0.0.1 localhost

    image-20201217230733913

2.安装与配置 PHP

1.安装 PHP 语言

  1. 获取 PHP 安装文件:建议去官网;

  2. 解压缩;

  3. 安装:放到自定义的文件夹下面

  4. PHP 文件的目录结构;

    image-20201218215503245
  5. PHP.exe 的应用

    1. php.exe 就是可以解析 PHP 代码转变成 HTML 代码,从而实现浏览器的解析功能;

      1. 通过 CMD 命令进入到 PHP.exe 所在目录;

      2. 通过 PHP.exe 运行命令来制定要解析的 PHP 脚本就可以: php.exe -f PHP文件所在目录

3.配置 Apache 加载 PHP 模块

  1. Apache 加载 PHP 模块:在 Apache 的主配置文件中加载对应的 PHP 提供的模块

    LoadModule php5_module PHP 所提供的模块链接所在路径

    image-20201220145241421
  2. Apache 分配工作给 PHP 模块:如果是 PHP 代码就交给 PHP 处理(以.php 结尾的文件就是 PHP 代码);

    image-20201220145447990
  3. 将 PHP 的配置文件加载到 Apache 的配置文件中:共同生效;

    1. 只需要在 Apache 中指定 PHP 的配置文件所在目录;

      PHPIniDir 'php.ini文件所在目录'

    2. php.ini 文件默认是不存在,是以 development 和 production 的形式存在的,需要格式化;

      image-20201220150233770
    3. PHP 的配置文件已经添加到了 Apache 的配置文件目录中,需要重启 Apache 才能生效;

4.安装与配置 MySQL

1.安装 MySQL 软件;

  1. 获取 MySQL 安装软件;

    image-20201220152643063
  2. 双击进行安装;

  3. 选择 custom:自定义安装,选择安装路径;

    1. 软件安装目录:E:/server/mysql;
    2. 数据安装目录:E:/server/mysql/data;
  4. 选择详细配置;

    image-20201220154015558
  5. 选择开发环境(选择默认的);

    image-20201220154533511
  6. 选择功能(默认选中);

    image-20201220155007882
  7. 并发设置(建议手动设置);

    image-20201220155346453
  8. 配置访问环境;

    image-20201220155905394
  9. 字符集设定:系统字符集;

    image-20201220160338953
  10. 服务安装:将 MySQL 作为 windows 下的一个服务启动;

    image-20201220160742419
  11. 输入 Root 超级管理员的用户密码:一般我们使用 root;

  12. 等待配置即可实现安装;

    image-20201220161053593

2.MySQL 的目录结构说明;

  1. bin 目录介绍;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X1YQ6dQB-1610525570940)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201220161844215.png)]

  2. 软件设计结构;

    1. C/S:Client 客户端/Server 服务端,用户只需要安装客户端产品才能访问服务器,而且只能访问一种软件(当前自己);
    2. B/S:Browser 浏览器/Server 服务端,用户只需要安装浏览器,就可以访问所有的服务器(B/S 架构服务);

3.MySQL 的访问流程

MySQL 是一款 c/s 架构的软件,需要通过客户端来访问服务端(ps:MySQL 也提供了其他的访问方式:通过插件扩展的方式来充当客户端访问)

  1. 启用 MySQL 客户端

    1. mysqld.exe,该软件本身可以通过 CMD 命令运行;
    2. mysql.exe 通过 CMD 命令启动;
  2. MySQL 客户端访问服务器端需要进行寻找匹配:连接认证

    连接: IP 和端口确认,如果是本地都可以省略;

    • -h 主机地址 --> -hlocalhost(可以是 IP);

    • -p 端口 --> -p3306;

    • -u 用户名 —> -uroot ,不可以省略(匿名用户除外);

    • -p 密码 ----> -proot

    mysql -hlocalhost -uroot -proot

    mysql -uroot -p

  3. 退出命令

    //1. \q
    //2.exit
    //3.ctrl+c
    

    PS:通常连接认证的时候密码不建议明文,可以在输入-p 之后回车,系统会再次让输入密码,这个时候就是密文

5.PHP 连接 MySQL

PHP 本身不具备操作 MySQL 的能力,需要借助 PHP 操作 MySQL 的扩展进行实现

1.PHP 加载 MySQL 扩展

  1. PHP 加载 MySQL 扩展:php.ini 文件中;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMdLc1Vu-1610525570944)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201220165716839.png)]

  2. PHP 中所有的扩展都是在 ext 文件夹中,需要指定扩展所在路径:extension_dir

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmYEzAND-1610525570952)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201220171016493.png)]

  3. 加载之后需要重新启动 Apache 服务器

2.修改 PHP 默认时区

ps: 在 php.ini 文件中,查找 timezone 然后进行修改

image-20201220171230205

6.配置虚拟主机

一台服务器很贵,如果只能部署一个服务器的话,则是非常的浪费,所以通过其他的渠道实现一台主机上面部署多个网站。

1.什么是虚拟主机

虚拟主机:virtual machine ,并不真实存在的主机,但是可以提供真实主机所实现的功能;通俗的讲,虚拟主机就是将计算机中不同的文件夹进行不同的命名,然后让服务器(Apache)根据用户的需求从不同的文件夹(网站)读取不同的内容。

2.虚拟主机的分类

在 Apache 中,可以将虚拟主机划分为两类;

  1. 基于 IP 的虚拟主机:一台电脑有多个 IP,每个 IP 对应一个网站;

    原理:电脑默认只有一个 IP,因为电脑默认只配备一个网卡,但是有的电脑可以配备多个网卡,每个网卡可以绑定一个 IP 地址;

  2. 基于域名的虚拟主机:一台电脑只有一个 IP,但是 IP 下可以制作多个网站,但是需要给每个网站不同的名字(虚拟主机名);

7.PHP 基本语法

PHP 是一种可以运行在服务器端的脚本语言,可以嵌入到 HTML 中

1.PHP 标记

在 PHP 的发展历史中,可以使用多种标记来区分 PHP 脚本

  • ASP 标记 :<% php 代码 %>

  • 短标记 : <? php代码 ?>

    前面两种标记基本已经废弃,但是如果使用的话,还是可以使用的,需要在我们的 php 配置文件中进行配置

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WwuPus1-1610525570955)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201221221356118.png)]

  • 脚本标记:

  • 标准标记:<?php php代码 ?>

2.注释

  1. // :单行注释
  2. # :单行注释
  3. /**/ : 多行注释

3.语句分隔符

在 PHP 中语句的分隔符是英文下的分号 ;
特殊说明:PHP 中标记结束符 ?> 有自带语句结束符的作用,最后一行 PHP 代码可以没有语句分隔符;

8.变量概念以及使用

1.变量

PHP是一种动态网站开发的脚本语言,动态语言特点就是交互性,会有数据的传递,而PHP作为“中间人”,需要进行数据的传递,PHP可以自己保存数据。

2.变量基本概念

变量来源于数学,是计算机语言中能存储计算结果或能表示抽象概念。变量可以通过变量名字来访问。在指令式语言中,变量通常是可变的的。

  1. 变量是用来存储数据的;
  2. 变量是有名字的;
  3. 变量是通过名字进行访问的;
  4. 变量是可以改变的;

3.变量的使用

PHP 的所有所有变量都是使用 “$” 进行定义;

  1. 定义:在系统中增加对应的变量名称(内存);

  2. 赋值:可以将数据赋值给变量名(可以在定义的同时完成);

  3. 可以通过变量名称访问存储的数据;

  4. 可以将变量从内存中删除;

//可以通过unset()函数对变量名称进行删除;
$time = time();
unset($time);

4.变量的命名规则

  1. 在 PHP 中变量名称必须使用 “ $ ”,进行开头;
  2. 名字由字母、数字和下划线 “_”,但是不能以数字开头;
  3. 在 PHP 中允许中文变量(不建议使用);

5.预定义变量

预定义变量:提前定义的变量、系统定义的变量,存储许多我们需要的数据(预定义变量都是数组)。

  • $_GET 获取表单 以“get”方式提交的信息;
  • $_POST 以‘post’方式提交的信息;
  • $_REQUEST 发送的请求数据;
  • $_GLOBALS PHP 中所有的全局变量;
  • $_SERVER 服务器信息;
  • $_SESSION session 会话数据;
  • $_COOKIE cookie 会话数据;
  • $_ENV 环境信息
  • $_FILES 用户上传的文件信息

6.可变变量

可变变量:如果一个变量保存的值刚好是另外一个变量的名字,那么直接可以通过访问一个变量得到另外一个变量的值:在变量前面再多加一个 “$”号;

<?php
  $a='b';
  $b='cccc';
  echo $$a;
?>

7.变量传值

将一个变量赋值给另一个变量:变变量传值;变量传值两种方式:值传递引用传递

值传递:将变量保存的值复制一份,然后将新的值给另外一个变量进行保存(两个变量之间没有关系);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-roYxmXlY-1610525570958)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201222205026988.png)]

引用传递:将变量保存的值所在内存地址,传递给另一个变量:两个变量指向同一块内存空间(两个变量是同一个值);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6DiAKpDT-1610525570959)(C:\Users\yarnnb\AppData\Roaming\Typora\typora-user-images\image-20201222205757080.png)]

在内存中,通常存在一下几个分区:
栈区 :程序可以操作的内存部分,(不存数据,运行程序代码),少但是快;
代码段:存储程序的内存部分(不执行);
数据段:存储普通数据(全局区和静态区);
堆区 : 存储复杂数据,大但是效率低;

8.变量范围

  1. 局部变量

    也被称之为内部变量。局部变量是在函数内部定义的,其作用域仅限于函数内部,离开函数后变量使用是错误的

  2. 全局变量

    全局变量是用global定义的,从程序的开始可以一直存在程序的结尾,定义的常量就是全局的,不需要使用global关键字进行定义,可以在脚本的任何位置进行使用

  3. 静态变量

    使用static关键字进行定义的变量

    函数执行完成之后不会立即消失,当再次调用函数时,静态变量保存的值依然存在,并且仅在第一次执行函数的时候会初始化值

9.常量

常量和变量一样,都是用来保存数据的;

1.常量的基本概念

常量:const/constant,是一种在程序运行当中,不可改变的量(数据);常量一旦被定义,通常数据不会改变(用户级别);

2. 常量的定义形式

在PHP中存在两种定义的方式(5.3之后才有两种);

  1. 使用定义常量的函数:define(“常量名”,“常量值”);
  2. 5.3之后才有的:const 常量名=常量值

常量的命名规则

  1. 常量不需要使用“$”进行命名,一旦使用系统就会认为是变量;
  2. 常量的名字组成由数字、字母、下划线组成,不能以数字开头;
  3. 常量的名称通常都是以大写字母为主,主要是为了和变量进行区分;
  4. 常量的命名规则比较松散,可以使用一些特殊字符,该方式只能使用define()函数进行定义;
define('-_-','smile');//正确的
const -_-='smile';//错误的

PS:注意细节

  1. define函数和const定义区别:在与访问权限区别;
  2. 定义常量通常不区分大小写,但是可以区分,可以参照define函数的第三个参数;
  3. 访问特殊字符的常量的时候,需要使用constant(“常量名称”)函数;

3.系统常量

系统常量:系统帮助用户定义的常量,用户可以直接使用;

常用的系统常量:

  1. PHP_VERSION:PHP版本号;
  2. PHP_INT_SIZE:整形大小;
  3. PHP_INT_MAX:整形可以表示的最大值(PHP中的整形是允许出现负数:带符号);

魔术常量:

在PHP中存在特殊的常量,以双下划线开头加常量名称,然后双下划线结尾,通常跟随系统改变,但是用户改变不了。

  1. __ DIR __:当前被执行文件的绝对路径;
  2. __ FILE __:当前被执行文件的绝对路径(带自己文件的名字);
  3. __ LINE __:当前执行代码的行数;
  4. __ NAMESPACE __:当前所属的命名空间;
  5. __ CLASS__:当前所属的类;
  6. __ METHOD __:当前所属的方法;
  7. __ FUNCTION __:获取当前函数的函数名称

10. PHP 的数据类型

数据类型:data type,在PHP中指的是存储数据本身的数据类型,而不是变量 的类型,PHP是一种弱类型的语言,变量本身没有数据类型。

1.PHP的八种数据类型

分为三大类八小类;

简单数据类型:4个小类

  1. 整形:int/integer ,系统分配4个字节存储,表示整数类型(有前提);
  2. 浮点型:float/double,系统分配8个字节存储,表示小数或者整形存不下的整数;
  3. 字符串型:string,系统根据实际长度分配,表示字符串(引号);
  4. 布尔类型:bool/boolean,表示布尔类型,只有true和false;

复合数据类型:2个小类

  1. 对象类型:object,存放对象(面向对象);
  2. 数组类型:array,可以一次性存储多个数据;

特殊数据类型:2个小类

  1. 资源类型:resource,存放资源数据,例如:PHP外部资源,如数据库、文件;
  2. 空类型:null,只有一个值,不能参与运算;

除了以上几种还有一种特别的数据:伪类型,主要有两种数据

mixed:混合的,可以是多种PHP中的数据类型

number:数值的可以是任意数值类型,整型或者浮点型

2.类型转换

<<<<<<< HEAD

3.类型判断

=======
在PHP中存在两种转换规则:

  1. 自动转换:根据系统的需求自己判定,自己转换,使用较多(但是效率比较低);
  2. 强制转换:人为根据需要进行目标类型数据转换;

在转换的过程中使用较多的转布尔类型(判断)和转数值类型(算术运算);

其他类型转布尔类型:true或者false,在PHP中很少的转换false;

强制转换规则:在变量之前增加一个括号(),然后在括号里面写上对应的数据类型:其中NULL类型需要用到unset()函数;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-14dCVJnt-1610525570960)(https://s3.ax1x.com/2020/12/23/ryY7rD.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFCcqe5b-1610525570961)(https://s3.ax1x.com/2020/12/23/ryGKqH.png)]

​ 其他类型转数值的说明:

  1. 布尔值true为1,false为0;
  2. 字符串转数值有自己的规则;
    1. 以字母开头的字符串,永远为零;
    2. 以数字开头的字符串,取到碰到字符为止(不会同时包含两个小数点);

3.类型判断

通过一组函数进行数据类型的判断,最终返回这个变量所保存数据的数据类型,(相同结果为true,否则为false),是以is__开头的后面跟上数据类型的函数,例如:is_int(),判断数据是否为整形。

Bool类型的数据不能通过echo函数进行查看,需要通过var_dump()进行操作。

ryrko8.png

还有一种类型的函数可以输出数据类型对应的字符串;

  1. gettype(变量名):获取类型,得到改数据类型对应的字符串;
  2. settype(变量名,数据类型):设定数据类型,与强制转换不同;
    1. 强制转换是对数据值复制的内容进行处理(不会处理实际存储的内容);
    2. settype会直接改变数据本身;

4.数据类型列表

1.整数类型

保存整数数值(范围限制),4个字节存储数据,最大就是32位:42亿多,但是在PHP中默认是有符号类型,用来区分正负数,默认PHP输出的都是十进制。

在PHP中提供了四种定义整型的方式:

  1. 二进制定义:$a=10;
  2. 八进制定义:$a=0b110;
  3. 十进制定义:$a=120;
  4. 十六进制定义:$a=0x11010;

二进制:逢2进1,能够出现的数字是0-1;

八进制:逢8进1,能够出现的数字是0-7;

十进制:逢10进1,能够出现的数字是0-9;

16进制:逢16进1,能够出现的数字是0-9,以及a-f,其中a表示10,以此类推;

1.转换方法

十进制转二进制:除2倒取余法;

不管得到的结果如何,需要补足32位:前面补0,:00000000 00000000 00000000 00001010;

转换函数:

  1. decbin():十进制转二进制;
  2. decoct():十进制转八进制;
  3. dechex():十进制转十六进制;
  4. bindec():二进制转十进制;

2.浮点类型

浮点型:小数类型以及超过整形所能存储范围的整数(不包括精度),精度范围大概在15个有效数字左右;

浮点数的定义:

  1. $f=1.23;
  2. $f=1.23e10, ‘e’ 表示以10为底

尽量不要使用浮点数进行精确判断:浮点数保存的数据不够精确,而且在计算机中凡是小数基本上存的都不准确;

3.布尔类型

布尔类型:只有true和false,通常使用在判断中。

但是在进行某些判断的时候,要特别注意类型判断

  1. empty():判断数值是否为空,如果为空返true,否则false;
  2. isset():判断数据存储变量本身是否存在,存在即为true,否则为false;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iu6Q9yU8-1610525570964)(https://s3.ax1x.com/2020/12/23/r6Yr6K.md.png)]

4.字符串类型

定义语法:

  1. 单引号:

  2. 双引号:

    引号方式适合定义比较短(不超过一行)或者没有语法结构要求的字符串,如果超过一行或者有语法结构可以使用下面的定义方式

  3. nowdoc字符串:没有单引号的单引号字符串

  4. heredoc字符串:没有双引号的双引号字符串

    //打印会显示自定义的格式
    $str1=<<<EOD
    hello 
        world
    EOD;
    $str2=<<<'EOD'
    hello
        world
    EOD;
    var_dump($str1);
    echo '<br/>';
    var_dump($str2);
    
1.字符串转义

含义:在计算机通用协议中,有一些特定的方式定义的字母,系统会进行特定处理,通常使用反斜杠+字母进行处理例如:\r\n

在PHP中识别转义符号也是同样的模式:反斜杠+字母

常用的转义符号:

\ ’ 在单引号字符串中显示单引号

\ " 在双引号字符串中显示双引号

\ r代表回车,理论上是回到当前行的首位置

\n 代表换行

\ t代表tab 类似换行,输出四个空格

\ $ 在PHP中使用 ¥符号作为变量符号,因此需要特定识别

单引号和双引号的区别

  1. 双引号中可以识别变量,单引号不可以,在双引号中要保证变量的独立性,可以使用{} 对变量进行对立性处理

结构化定义字符串的规则:

  1. 上边界符后面不可以跟任何的内容
  2. 下边界符必须顶格使用,而且只能跟分号,不能跟其他任何的内容
  3. 边界符之间所有的内容都是字符串本身
$str1="helloworld";
$str=<<<STR
<script>
    alert('$str1');
</script>
STR;
echo $str;
2.字符串的长度问题

基本函数问题:strlen()获取到字符的长度,是以字节为单位的

$str="hello china";
$str_china='你好 中国';
echo strlen($str_china),"<br/>",strlen($str);//中文在utf-8字符集下面占用三个字节

使用mbstring模块进行字符串的扩展使用,需要在PHP配置文件(php.ini)中进行释放,strlen针对的是标准的ASCII码,而mbstring模块针对的是多种字符集的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-49MJImgJ-1610525570965)(https://s3.ax1x.com/2020/12/29/rHFxeO.png)]

3.字符串相关函数
  1. 转换函数:

    implode:将数组用一定的规则连接成字符串

    explode:将字符串按照一定的规则进行分割

    str_split: 将一个字符串按照规定的长度进行切割成数组

  2. 截取函数:

    trim: 去除字符串首尾处的空白字符(或者其他字符)

    ltrim:去除左边的空格

    rtrim:去除右边的空格

  3. 大小转换函数:

    substr:从指定位置开始,截取指定长度的字符串

    strstr:从指定位置开始截取到最后,可以用在取文件名字

  4. 替换函数:

    strtolower:转换小写字母

    strtoupper:转换大写字母

    ucfirst:首字母大写

  5. 查找函数:

    strpos: 查找字符串首次出现的位置

    strrpos:计算指定字符串在目标字符串中最后一次出现的位置

  6. 替换函数:

    str_replace:子字符串替换

  7. 格式化函数:格式化输出数据

    printf:

    sprintf:

    $age = 25;
    $location = '河南省郑州市金水区';
    $formatStr = 'TOM %d 岁 居住在 %s';//d 作为整形数字显示 s 作为字符串进行显示
    
    echo sprintf($formatStr, $age, $location);
    //        需要过滤的字符串,过滤条件按照顺序以此类推
    
  8. 其他函数:

    str_repeat :— 重复一个字符串多少次

    str_shuffle:随机打乱一个字符串

5.数组类型详解

1. 概念

数组:array,数据的组合,将一组数据存储到指定的容器中,用变量指向该容器,然后通过变量取得容器中的所有数据

2.数组定义

在PHP中有多种定义Array的语法

  1. 使用array关键字,这也是最常使用 $变量=array (元素1,元素2,元素3,。。。。。)
  2. 使用中括号:$变量=[元素1,元素2,元素3,…]
  3. 隐形定义数组:$变量[]=值 $变量[下标]=值
3.数组特点
  1. 数组的下标可以是数字或者字符串

    1. 如果数组下标为整数,称之为索引数组
    2. 如果数组下标为字符串,称之为关联数组
  2. 不同的下标可以同时存在,称之为混合数组

  3. 数组元素的顺序以放入顺序为准,与下标大小无关

  4. 下标的自增长特性:从0开始自动增长,如果手动添加更大的,那么后面自增元素从最大的值+1开始

  5. 特殊下标的自动转换,不要使用特殊含义的下标

    $str[true]=true;
    $str[false]=false;
    $str[NULL]=NULL;;
    //打印结果
    array(3) {
      [1]=>
      bool(true)
      [0]=>
      bool(false)
      [""]=>
      NULL
    }
    
  6. PHP数组中元素没有数据类型限制

  7. PHP数组元素没有长度限制

  8. PHP数组是很大的数据,所以存储在堆区,为当前数组分配一块连续的空间存储

4.多维数组
  1. 二维数组

    多维数组:数组里面的元素又是数组

  2. 多维数组

    数组中所有的元素都是一样一维数组,但是不建议使用超过三维以上的数组,会增加访问的复杂度,降低访问效率

  3. 异型数组(不规则数组)

    异型数组:数组中的元素不规则,有普通基本变量也有数组,在实际的开发过程中,并不常见,开发过程中尽量让数组元素规则化,便于进行访问

5.数组遍历
1.遍历的基本含义

数组遍历:普通数据的访问都是通过数组元素的下标实现访问,如果说数组中所有的数据都需要依次输出出来,就需要我们使用到一些简化的规则 来实现自动获取下标以及输出数组元素

2.forEach遍历语法
foreach ($userArr as $key => $value) {
  $type= gettype($value);
  if($type!=="integer"){
    $userArr[$key]=mt_rand();
  }else{
    $userArr[$key]=date("Y-m-d",mt_rand());
  }
}

使用forEach进行多维数组的解构

function splitArray($targetArr){
  static $i=0,$resultArr;
  foreach ($targetArr as $key => $val){
    $type=gettype($val);
    if ($type ==='array'){
        splitArray($val);
        continue;
    }
    $resultArr[$i]=$val;
    $i++;
  }
  return $resultArr;
}
splitArray($dimArr);

//定义一个多维数组
$dimArr=array(
  array(1,2,3,4,5,6,7),
  array('hello','world','this','is','beautiful'),
  array(true,false,NULL),
  array(1.2,12.4,19.8,110,time()),
  "and grown old",
  true,
  NULL,
  array(
    array(1997,mt_rand(),mt_rand()),
    'helloworld',
    array(time(),'echo'),
  ),
);

遍历原理:数组内部有一个指针,默认指向数组的第一个元素,利用指针去获取元素,同时移动指针

  1. foeach会重置指针:让指针指向第一个元素
  2. 进入foreach循环:通过指针取的当前的第一个元素,然后将下标取出放到对应的变量 k e y 中 , 将 对 应 下 标 对 应 的 值 放 到 key中,将对应下标对应的值放到 keyvalue中,然后指针下移
  3. 进入循环体内部,循环开始执行
  4. 重复执行2和3,直到数组的下标不存在,即为结束
3.for循环遍历数组
  1. 需要获取数组的长度
  2. 需要数组下标是规则的数字
  3. 有一个边界的限定条件
$num= array(1,2,3,4,5,6);
for ($i=0,$len=count($num);$i<$len;$i++){
  echo $i,$num[$i],'<br/>';
}
4.while结合each和list

while循环

$i=0;
while ($i<count($num)){
  echo $num[$i],"<br/>";
  $i++;
}

each函数:返回数组中当前的键/值对并将数组指针向前移动一步,如果最后each取不到结果,则返回false

list函数:不是一种函数,而是一种结构,把数组中的值赋给一组变量

  1. list不能对字符串起作用

6.数组排序

  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:获取一个数组的所有value值,返回一个索引数组

11.运算符

运算符:operator,是一种将数据进行运算的特殊符号,在PHP中存在数十种。

1.赋值运算符

赋值运算:符号 “=”;

2.算数运算符

算数运算:算数基本操作

+:数据相加;

-:数据相减;

*:数据相乘;

/:数据相除;

%:取余(模)运算,整数相除,保留余数,第二个参数不能为0,0不能作为被除数;

3.比较运算符

通常是比较两个数据的大小,或者两个数据是否相等;

“>”:左边大于右边;

“>=”:左边大于等于右边;

“<”:左边小于右边;

“<=”:左边小于等于右边;

“==”:左右大小相等;

“!=”:左边和右边不同;

“===”:左右大小和类型全部相等;

“!==”:大小或者类型不同;

4.逻辑运算符

逻辑运算:针对不同的结果进行匹配,满足为true,不满足为false;

&& :逻辑与,两边的条件需要同时满足;

| |:逻辑或,左边或者右边的条件有一个满足即可;

!:逻辑非,对已有的条件进行取反;

5.连接运算符

连接运算:将多个字符串进行拼接的一种符号;

. :将两个字符串连接到一起;

.=:符合运算:

a.=b;//a=a.b;

6.错误抑制符

在PHP中有一些错误可以提前预知,但是这些错误无法避免,但是又不希望报错给用户看,可以使用错误抑制符;

@ : 在可能出错的表达式前面使用“@”符号即可;

通常会在生产(上线)环境会用到,在开发(编写代码)过程中一般不会使用;

7.三目运算符

三目运算:有三个表达式参与的计算(简单的分支结构缩写);

语法格式:

表达式1:?表达式2:表达式3

如果表达式1成立,则执行表达式2,否则执行表达式3。表达式2和表达式3都可以是另外的三目运算;

8.自操作运算符

++i:前置操作符,先把自己改变,然后把改变的值,传给别人;

i++:后置操作符,保留自己的值,然后改变自己,把自己原来的值传给别人。

衍生符号

+=: a = a= a=+$b;

=": a = a= a=a"”$b;

/+: a = a= a=a/$b;

%=: a = a= a=a%$b;

ps:右边十一个整体, a + = a+= a+=b;===> a = a= a=a+($b);如果进行除法或者取余运算,那么考虑右边表达式的结果是否为0(为0就会出错);

9.计算机码

计算机码:计算机在实际存储数据的时候,采用的编码标准(二进制规则);

分为:原码、反码、补码。数据本身最左侧的一位用来充当符号位,0代表正数,1代表负数

原码:数据本身十进制转化二进制得到的结果

​ 正数:最左侧符号位为0;

​ 负数:最左侧符号位为1;

反码:针对负数,符号位不变,其他位置取反;

补码:针对负数,反码加1;

系统中存在两个0;

+0:00000000 原码

-0:10000000 原码

​ 取反:11111111

​ 补码:00000000(+1之后溢出了);

<?php
 $a=5;
 $b=-5;
 echo decbin($a);//00000000 00000000 00000000 00000101
 echo "<br/>";
 echo decbin($b);//11111111 11111111 11111111 11111011

 //-5 原码 10000000 00000000 00000000 00000101
 //反码:11111111 11111111 11111111 11111010
 //补码:11111111 11111111 11111111 11111011   在反码的基础之上加1
?>

10.位运算

位运算:取出计算机中最小的单位(bit)进行运算;

&:按位与,两个位都为1,结果为1,否则为0;

|:按位或,两个其中一个为1,结果为1,否则为0;

~:按位非,一个位如果为1,则变成0,否则反之;

^:按位异或,两个相同则为0,否则为1,

<<:按位左移,整个位(32位),向左移动一位,右边补0 ,相当于乘于2的操作

“>>”:按位右移,整个位向右移动一位,左边补符号位对应内容(正数补0,负数补1,相当于除于2 的操作(不完全正确),整数除2会出现小数

PS:注意

  1. 系统进行任何位运算的时候都是使用的补码,如果的是正数的情况下,原码和补码是一样的;
  2. 运算结束之后都必须转换成原码才是最终需要显示的数据;

11.操作符优先级

详情参考PHP运算符优先级

12.流程控制

流程控制:代码的执行方向;

1.控制分类

顺序结构:代码从上往下执行,顺序执行。(代码执行的最基本结构);

分支结构:给定一个条件,同时有多种的可执行代码块,然后根据条件执行某一段代码;

循环结构:在某个条件控制范围内,指定的代码(块)可以重复执行;

1.顺序结构

顺序结构:代码从上往下执行,顺序执行。(代码执行的最基本结构);

2.分支结构

1. If分支

给定一个条件,同事为条件设置多种可执行情况,然后通过条件判断来实现具体的代码执行段;

  1. 最简单

    if(判断条件){

    ​ 可执行代码段

    }

  2. 基础If

    if(条件表达式){

    ​ 可执行代码端

    }else{

    ​ 可执行代码段

    }

  3. 复杂If

    if(判断条件){

    ​ 可执行代码段

    }else if(判断条件){

    ​ 可执行代码段

    }else{

    ​ 可执行代码段

    }

PS:注意

  1. 如果条件比较单一(同一个条件),会采用elseif的形式;
  2. 如果判断条件不一致的,建议使用嵌套的语法(但是不宜嵌套过多);
2.Switch分支

3.循环结构

循环结构:代码段在一定的控制下,可以执行多次;

在PHP中循环结构有以下几种:

for循环:

while循环:

do-while循环:

forEach循环:针对数组

1.for循环

for循环的特殊使用:for循环对应的小括号内(条件)可以一个都没有,就是死循环了,尽量避免这个情况

for(;;){
	echo "hello world";
}

for循环的使用案例,PHP输出乘法口诀

for ($i = 1; $i <= 9; $i++) {
    for ($j = 1; $j <= $i; $j++) {
      echo (string)$j . '*' . (string)$i . '=' . (string)($i * $j) . "&nbsp;";
      if ($i == $j) echo "<br/>";
    }
  }
2.do-while和while循环
  1. while循环的使用;
function useWhile()
{
  $i = 1;//初始化条件
  while ($i <= 10) {//代码块
    echo $i++, "<br/>";//自增运算
  }
}
useWhile();
  1. do-while循环会至少执行一次,然后再去执行循环体
function useDoWhile()
{
  $i = 1;
  do {
    if (!($i % 2)) {
      echo $i . "is even", "<br/>";
    } else {
      echo  $i . "is odd", '<br/>';
    }
    $i++;
  } while ($i <= 10);
}
useDoWhile();

2.循环结构流程控制

在循环内部对循环本身进行控制

中断控制:重新开始循环,循环体中还有其他的内容,也再执行

continue:层级默认是1,(循环可以多层嵌套);

function loopControl()
{
  $i = 1;
  while ($i <= 10) {
    $i++;
    if ($i % 2) {
      echo $i . 'is odd ', "<br/>";
      continue;
    }
    echo $i, "<br/>";
  }
}

loopControl();

终止控制

break:层级默认是1

内部循环可以控制到外部,,就是通过使用层级参数

continue2;//当前自己循环后面内部不再执行,同时外部循环如果还有循环体本身也不再执行,重新来过

break2;//当前自己循环结束,同时外部也结束(如果还有外部不受影响,继续执行);

3.流程控制替代语法

PHP本身是嵌入到HTML中的脚本语言,需要在HTML中书写一些关于判断或者循环的结构语法,必须符合PHP的标签规范,需要HTML与PHP进行混搭,如果使用原始的PHP代码,将会非常的不美观;

PHP应该只在HTML中做数据输出,输出通常伴有条件判断和循环操作,因此PHP提供了对应分支结构和循环结构的替代语法:

左大括号"{"使用冒号进行代替;

右大括号"}"使用end+对应的标签名称进行代替;

if: if(): endif;

for: for(): endfor;

switch: switch(): endswitch;

while: while() : endwhile;

//九九乘法表
<table border=1>
  <?php for ($i = 1; $i < 10; $i++) { ?>
    <tr>
      <?php for ($j = 1; $j <= $i; $j++) { ?>
        <td>
          <?php echo $j . "*" . $i . "=" . $j * $i, "<br/>"; ?>
        </td>
      <?php } ?>
    </tr>
  <?php } ?>
</table>

修改版本

<table border=1>
  <?php for ($i = 1; $i < 10; $i++) : ?>
    <tr>
      <?php for ($j = 1; $j <= $i; $j++) : ?>
        <td>
          <?php echo $j . "*" . $i . "=" . $j * $i, "<br/>"; ?>
        </td>
      <?php endfor ?>
    </tr>
  <?php endfor ?>
</table>

13.常用的系统函数

1.输出函数

print():类似echo,本质是一种结构,不是函数,使用结果返回1,可以不用使用括号。

print_r():类似var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值,在数组打印中使用较多。

2.时间函数

date():按照不同的格式对时间戳进行格式化,时间默认是从1970年1月1日开始的(格林威治时间),详情参考PHP开发手册

time():获取当前时间的时间戳

microtime():获取微妙时间的时间戳

strtotime():将字符串时间,转换成unix时间戳

3.数学函数

max():指定参数中最大的值

min():指定参数中最小的值

rand():得到一个区间的随机数

mt_rand():比rand更好,一般使用这个获取

round():四舍五入

ceil():向上取整

floor():向下取整

pow():获取指数值

abs():绝对值

sqrt():

4.“函数”函数

function_exists():判断函数是否存在

func_get_arg():获取指定的参数

func_get_args():获取函数的参数列表 ,获取的实参列表

func_num_args():获取函数参数数量,获取的实参列表

14.中文乱码解决

解决方法:

在<?php后面第一行写上

<?php
   header("Content-type: text/html; charset=utf-8");    
 ?>

保存后再在浏览器中查看就不会显示乱码了

15.文件加载

1、文件加载原理

  1. 在文件加载include或者require的过程中,系统会自动将被包含文件中的代码相当于嵌入到当前文件夹中

  2. 加载位置:在哪里加载,对应的文件代码嵌入的位置就是对应的include的位置

  3. 在PHP中被包含的文件都是单独编译的

    包含的文件执行失败时,那么直接失败,如果是被包含的文件代码出现语法错误,系统会在执行到这个include的时候才会报错

2、include和require的区别

include和include_once的区别:

  1. include系统碰到一次就会执行执行一次,如果include多次的话,系统会执行多次
  2. include_once如果多次的话,系统只会执行一次

require和include的区别:本质都是包含文件,唯一的区别在于包含文件的报错形式不一样

  1. include的报错级别较低,不会影响后续代码的执行
  2. require的报错级别较高,如果出错将会影响后续代码的执行,相当于是一个阻塞操作

3、文件加载路径

文件加载时候需要指定文件的加载路径才可以保证 PHP可以正确的寻找到对应的文件

加载路径分为两大类

  1. 绝对路径

    从磁盘的根目录开始,本地的绝对路径

    Windows:盘符C:/路径/PHP文件

    Linux:/路径/PHP文件

    从网站的根目录

    /:相对于网站主机名字对应的路径,例如

    localhost/index.php --->  E:/server/apache/htdocs/index.php
    
  2. 相对路径:从当前文件所在目录开始的路径

    “.“或者”./”:表示当前文件夹

    “…/”:表示上一级目录,当前文件夹的上一层

区别:

  1. 绝对路径相对来说效率偏低,但是比较安全,路径不会出错
  2. 相对路径相对效率较高,但是容易出错,因为相对路径会发生改变

4、文件嵌套包含

文件嵌套包含:一个文件包含另一个文件,同时另一个文件又包含了另外一个文件

嵌套包含的时候很容易出现性对路径出错的问题:相对路径会因为文件的包含而改变./和…/的位置会发生改变

16.函数的定义使用

1.函数的定义和调用

函数:function,一种语法结构,将实现某一个功能的代码块封装起来,从而实现代码的复用。函数对应的以下几种关键点,function关键字、函数名、参数、函数体、返回值

基本语法如下

function function_name([参数]){
    //函数体
    //return   返回值
}

目的:实现代码的可复用性

2.函数命名规范

由数字、字母、下划线组成,但是不能以数字开头

遵循以下规则:函数名称代表相应的使用,有些功能比较复杂,一个单词可能搞不定

  1. 驼峰法:除了左边第一个单词外,后面所有的单词首字母都大写:getParentData()
  2. 下划线:单词之间通过下划线连接,单词都是小写:get_user_info()
  3. 在一个脚本周期中,不允许出现同名函数,通常在一个系统的开发过程中,不会出现同名函数

3.函数参数

1.函数参数

函数参数分为:形参实参

形参:形式参数,不具备实际意义的参数,是在函数定义时使用的参数,形参是实参的载体

实参:实际参数,具有实际意义的参数,是在函数调用时使用的参数,传入的实参可以是变量或者其他有值的表达式

2.默认值

默认值:default value 指的是形参的默认值,在函数定义的时候,就给形参进行一个初始化赋值,如果在实际调用的过程中没有传入实参,则使用这个默认的形参值进行函数的运算

3.引用传递

实参在调用时会将值赋值给形参,那么实际上使用的就是一种简单的值传递,形参与外部的变量本身没有任何的关联,但是有的时候,我们希望在函数内部可以改变在函数外部定义的变量,这个时候需要告知函数,函数才会在调用的时候去主动获取外部数据的内存地址。这种形式称之为引用传值

语法如下:

function func_name($a,&$b){//在这里添加&符号,代表的就是引用传值
  echo 'helloworld';
}
$a=1;
$b=2;
func_name($a,$b);//在使用的时候$b必须是变量,不可以是确切的数据,否则会报错

**注意:**函数调用的时候,一定要是变量,不可以是确切的数据,否则会报致命的错误。

4.函数体

函数体:大括号里面所有的代码都被称之为函数体

函数体基本上所有的代码都可以实现

  1. 定义常量
  2. 定义变量
  3. 使用流程控制
  4. 可以调用函数

5.函数返回值

返回值:return,指的是将函数实现的结果,通过return关键字,返回给函数外部(函数调用处),在PHP中所有的函数都有返回值,如果没有使用return关键字,则默认返回值是NULL

  1. 函数返回值可以是任何的数据类型
  2. return代表函数执行结束return直接结束函数

4.可变函数

可变函数:一个变量保存的值刚好是一个函数的名字,那么就可以使用变量来充当函数名称进行使用,可变函数还是使用比较多的


function func_change(){
  echo 'helloworld';
}
$name="func_change";
$name();

5.匿名函数

匿名函数:定义时候没有名字的函数,变量保存匿名函数,本质是得到一个对象(Closure)

function(){
  echo "helloworld";
}

6.闭包函数

闭包:closure为了使某个函数内部的变量不被释放

header("Content-type:text/html;charset=utf-8");
function closure(){
  $name='alex';
  echo '我是我是closure函数中的'.$name.'<br/>';
  $inner=function () use ($name){//需要使用use关键字进行变量的使用
    echo '我是inner函数中的'.$name."<br/>";
  };
  $inner();
}
closure();//在调用的过程中,$name已经被释放了
header("Content-type:text/html;charset=utf-8");
function closure()
{
  $name = __FUNCTION__;
  $inner = function () use ($name) {
    echo $name;
  };
  return $inner;
}

$returnValue = closure();//closure函数执行结束,但是变量并没有得到释放
$returnValue();//返回匿名函数进行调用

17.作用域

作用域:变量、常量能够访问的区域

  1. 变量可以在普通代码中定义
  2. 变量也可以在函数中定义

严格来说分为两种,但是在PHP中还定义了严格意义之外的一种

  1. 全局变量:用户普通定义的变量

    所属全局空间,在PHP中只允许在全局空间中使用,理论上函数内部不可使用

    脚本周期:知道脚本运行结束

  2. 局部变量:函数内部定义的变量

    所属当前函数空间,在PHP中只允许在当前函数自己内部使用

    函数调用:函数执行结束(函数是在栈区开辟独立的运行空间)

  3. 超全局变量:系统定义的变量(预定义变量,$_POST )

    所属超全局空间:没有访问限制,函数内外都可以访问,超全局变量会自动将全局变量归入到 G L O B A L S 中 , GLOBALS中, GLOBALSGLOBALS没有作用域限制,可以帮助局部去访问全局变量,但是必须使用数组的方式

如果想在函数内部使用外部变量,除了**$_GLOBALS**外,还可以通过引用传值

PHP中还有一种方式,可是实现全局访问局部、局部也可以的访问全局:***global***关键字

global关键字是一种在函数内部定义变量的一种方式

  1. 使用global关键字定义的变量,如果在外部全局变量存在相同名称,那么就是同一个变量,指向同一个内存地址
  2. 使用global定义的变量外部不存在,系统会自动在全局空间定义一个与局部变量同名的全局变量

语法:global 变量名,不可以进行赋值

虽然以上的方式可以实现全局变量和局部变量的 互相访问,但是一般不会这样使用,如果使用的话,也会使用参数的形式进行访问

1、静态变量

静态变量:static,是在函内部定义的函数,使用static进行修饰,用于实现跨函数共享数据的变量,函数运行结束后所有的局部变量都会消失,如果重新运行下一个函数,所有的局部变量都会进行初始化

语法:

function static_func(){
  static $a=1;
  echo $a."    is a static variable";//$a 就是一个static变量
}
static_func();
//函数执行中,遇到static关键字,则会自动跳过static这一行

使用:

  1. 统计当前函数的调用次数
  2. 统筹函数多次调用得到的不同结果

18.错误处理

错误处理:指的是系统或者用户在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员

1.错误分类

  1. 语法错误:parse error,用户编写的代码不符合PHP的代码规范,导致在编译过程中不通过,所以代码不会执行
  2. 运行错误:runtime error,代码编译通过,但是代码在执行过程中会出现一些条件不满足导致的错误
  3. 逻辑错误:程序员在书写代码时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果

2.错误代号

所有看到的错误代码在PHP中都被定义成了系统常量

  1. 系统错误:

    E_PARSE:编译错误,代码不会执行

    E_ERROR: fatal error 致命错误,代码会在出错位置停止执行

    E_WARNING: 警告错误,不会影响代码执行,但是会得到意想不到的结果

    E_NOTICE: 通知错误,不会影响代码运行,只是影响美观

  2. 用户错误:E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE

    用户使用自定义错误触发的时候,会用到的错误代号,系统不会用到

  3. 其他错误: E_ALL

    代表这所有的错误,通常在进行错误控制的时候使用较多,建议在开发过程(开发环境)中使用

所有E开头的错误常量都是一个字节存储,然后每一种错误占据了一个对应的位,如果想进行一些错误的控制,可以使用位运算进行操作,例如:

排除通知级别notice : E_ALL &~ E_NOTICE

只要警告和通知:E_WARNING | E_NOTICE

3.错误触发

  1. 程序运行时触发:系统根据错误发生后,对比对应的报错信息,输出给用户,主要针对代码的语法和运行时的错误
  2. 人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发相应的错误提示

可以使用trigger_error(param1,param2)函数对错误进行抛出,第二个错误可以进行设置类型

4.错误显示设置

错误显示设置:那些错误该显示,以及该如何显示

PHP中,有两种方式来设置当前脚本的错误处理

  1. PHP的配置文件:全局配置php.ini文件,这种是全局的

    display_errors:是否显示错误

    error_reporting:显示什么级别错误

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b6FolQ4i-1610525570970)(https://s3.ax1x.com/2020/12/28/rT1TiV.png)]

  2. 在PHP脚本代码中去设置:在脚本中定义的配置项级别高于php.ini配置文件,所以我们一般需要在脚本中进行设置

    1. error_reporting(): 设置对应的错误显示级别

    2. ini_set():ini_set(“配置文件的配置项”,配置项的值)

      ini_set('error_reporting',E_ALL);
      ini_set('display_errors',on);//设置1也是可以的
      

5.错误日志设置

在实际生产环境中,不会直接让错误赤裸裸的展示给用户

  1. 不友好
  2. 不安全:会暴露网站的很多信息,路径、文件名

所以在生产环境中,一般不会显示错误,但是不可避免的会出现错误,这个时候不希望看到,但是又希望铺捉到可以让后台程序员进行修改,需要在PHP配置文件中或者ini_set()设置对应的error_log配置项

error_log配置项

  1. 开启日志功能

    rTYu7j.png

  2. 指定路径

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yBLQlejO-1610525570972)(https://s3.ax1x.com/2020/12/28/rTYFht.png)]

6.自定义错误处理

最简单的错误处理:trigger_error()

但是我们还可以通过set_error_handler()函数进行自定义报错处理

function myErrorHandler($errno, $errstr, $errfile, $errline,$errcontext)
{
  if (!(error_reporting() & $errno)) {
    return false;
  }
  switch ($errno) {
    case E_USER_ERROR:
      echo "  Fatal error on line $errline in file $errfile";
      break;
    case E_USER_WARNING:
      echo "Warning in file".$errfile.'on line '.$errline.'<br/>';
      break;

    case E_USER_NOTICE:
      echo "Notice in file".$errfile.'on line '.$errline.'<br/>';
      break;
    default:
      echo "<b>Unknown error type:</b> in file".'<b>'.$errfile.'</b>'.' on line '.$errline.'<br/>';
      break;
  }
  return true;
}

echo $a;
set_error_handler("myErrorHandler");
echo $a;

19.编程思想

编程思想: 利用数学模式,来解决对应的需求问题,然后用代码来实现对应的数据模型

算法:使用代码实现对应的数学模型,从而解决对应的业务问题

1.递推算法

一种比较简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。分为顺推逆推两种

顺推:通过最简单的条件,然后逐步推演结果

逆推:通过结果找到规律,然后推到已知条件

  1. 菲波那切数列

    //for 循环
    function fiqSequence($site)
    {
      if($site===1|| $site===2)return 1;
      $fiq_sequence[0]=1;
      $fiq_sequence[1]=1;
    
      for ($i=2;$i<$site;$i++){
        $fiq_sequence[$i]=$fiq_sequence[$i-1]+$fiq_sequence[$i-2];
      }
      return $fiq_sequence[$site-1];
    }
    print_r(fiqSequence(20));
    

2.递归算法

递归算法:把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数来表示问题的解

  1. 简化问题:找到最优子问题
  2. 函数自己调用自己

递归思想比较重要的两点:

  1. 递归点:发现当前问题可以有解决当前问题的函数,去解决规模比当前小一点的问题来解决
  2. 递归出口:当问题解决的时候,已经到达最优子问题,不能再次调用函数
  3. 如果一个函数递归调用自己没有递归出口那就是死循环

递归的本质就是函数调用函数:一个函数需要开辟一块内存空间,递归会n次的调用自己,递归的本质就是利用空间换取时间

function fiqSequence($n){
  if($n===1||$n===2) return 1;
  return fiqSequence($n-1)+fiqSequence($n-2)
}
fiqSequence(5);

3.数组冒泡排序

冒泡排序:bubble sort,是一种计算机中的比较简单的排序算法。

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,走访到没有需要交换,工作完成。

冒泡排序思路:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LMZELVNo-1610525570975)(https://s3.ax1x.com/2021/01/06/sEVETI.gif)]

//3. 冒泡排序 bubble sort
function bubbleSort($sortArr)
{
  //重复找出最大的数
  for ($j = 0, $len = count($sortArr); $j < $len; $j++) {
    //找出最大的数,越往后面需要循环次数越少
    for ($i = 0, $len = count($sortArr); $i < $len - 1- $j; $i++) {
      if ($sortArr[$i] > $sortArr[$i + 1]) {
        $median = $sortArr[$i];
        $sortArr[$i] = $sortArr[$i + 1];
        $sortArr[$i + 1] = $median;
      }
    }
  }
  return $sortArr;
}

4.选择排序

选择排序:(Selection-sort)是一种简单直观的排序算法。

工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕,是一种比较不稳定的排序方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Mo6fIPA-1610525570977)(https://s3.ax1x.com/2021/01/06/sEDfxK.gif)]

$num = array(1, 5, 3, 9, 4, 8, 7, 2, 6);
function selectSort($sortArr)
{
  for ($i = 0, $len = count($sortArr); $i < $len; $i++) {
    $minIndex = $i;

    for ($j = $i + 1; $j < $len; $j++) {
      if ($sortArr[$j] < $sortArr[$minIndex]) {
        $minIndex = $j;
      }
    }

    if ($minIndex != $i) {
      $median = $sortArr[$i];
      $sortArr[$i] = $sortArr[$minIndex];
      $sortArr[$minIndex] = $median;
    }
  }
  return $sortArr;
}

5.插入排序

插入排序:是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,ta是稳定排序

  1. 从第一个元素开始,该元素可以认为已经被排序;

  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;

  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;

  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

  5. 将新元素插入到该位置后;

  6. 重复步骤2~5。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RNhMJnU6-1610525570978)(https://s3.ax1x.com/2021/01/06/sEH4QU.gif)]

function insertSort($sortArr)
{
  $len = count($sortArr);
  for ($i = 1; $i < $len; $i++) {
    $median = $sortArr[$i];//取出一个 比较 的值
    for ($j = $i - 1; $j >= 0; $j--) {
      if ($sortArr[$j] > $median) {//比较大小,交换顺序
        $sortArr[$j + 1] = $sortArr[$j];
        $sortArr[$j] = $median;
      } else {
        continue;
      }
    }
  }
  return $sortArr;
}

6.快速排序

快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。ta是不稳定的排序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L51IHg2z-1610525570979)(https://s3.ax1x.com/2021/01/06/sVA60A.gif)]

快速排序思想:

  1. 从数组中选取一个元素(通常是第一个),作为参照对象
  2. 定义两个数组,将目标数组中剩余的元素与参照元素进行挨个比较,小的放进一个数组,大的放进一个数组
  3. 第二步执行完成之后,前后的数组顺序不确定,但是可以确定自己的位置
  4. 将得到小数组按照1-3重复进行操作
  5. 回溯最小数组
function quickSort($sortArr)
{
  $len = count($sortArr);
  if ($len <= 1) return $sortArr;//递归出口
  $small = $big = array();

  for ($i = 1; $i < $len; $i++) {
    if ($sortArr[$i] < $sortArr[0]) {
      $small[] = $sortArr[$i];
    } else {
      $big[] = $sortArr[$i];
    }
  }

  $small = quickSort($small);
  $big = quickSort($big);

  return array_merge($small, array($sortArr[0]), $big);
}

7.归并排序

归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aoeq1yKQ-1610525570981)(https://s3.ax1x.com/2021/01/07/sZ6mdO.gif)]

function mergeSort($sortArr)
{
  $len = count($sortArr);
  if ($len <= 1) return $sortArr;

  $midIndex = floor($len / 2);
  $left = array_slice($sortArr, 0, $midIndex);
  $right = array_slice($sortArr, $midIndex);

  //对拆分的左右数组进行无限的拆分排序
  $left = mergeSort($left);
  $right = mergeSort($right);

  $midArray = array();
  while (count($left) && count($right)) {
    $midArray[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right);
  }
  return array_merge($midArray, $left, $right);
}

20.查找算法

含义:查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,查找算法是指定实现查找过程中的代码结,就是中大型数组中去快速定位想要的元素

顺序查找:也称为线性查找,从数据结构线性表的一端开始,顺序扫描,依次将扫描到的节点关键字与给定 值k相比较,若相等则表示查找成功,若扫描结束仍没有找到关键字,则扫描失败

function checkOrder($arr,$num){
  for ($i=0,$len=count($arr);$i<$len;$i++){
    if ($arr[$i]===$num){
      return true;
    }
  }
  return false;
}

二分查找:当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法,二分查找又叫折半查找。它对要查找的序列有两个要求,一是该序列必须是有序的(即该序列中的所有元素都是按照大小关系排好序的,升序和降序都可以,本文假设是升序排列的),二是该序列必须是顺序存储的。

function halfSeek($arr, $num)
{
  $low = 0;//左边边界
  $high = count($arr);//右边边界

  /*
   * 当low 小于等于high的时候代表依然有可查找元素
   */
  while ($low <= $high) {
    $mid = floor(($low + $high) / 2);
    if ($arr[$mid] === $num) {
      return $mid;
    } elseif ($arr[$mid] < $num) {
      //中间值小于 当前值
      $low = $mid + 1;
    } elseif ($arr[$mid] > $num) {
      //中间值大于 当前值
      $high = $mid - 1;
    }
  }
  return -1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值