文章目录
PHP的基本概念
-
名字全称:PHP的全称是
PHP Hypertext Preprocessor
,即PHP超文本预处理器。 -
基本定位:一种常用于动态性交互网站的后端编程的解释型语言。
-
版本情况:PHP最新的版本是
PHP8
,但是市面上目前最常用的还是PHP7
。 -
基本特点:
- 开源免费:PHP是一门开源且免费的编程语言。
- 跨平台:PHP可以支持
Windows
、Linux
、Unix
、MacOS
等操作系统。 - 多种服务器支持:支持
Apache
、Nginx
、IIS
等类型的服务器。 - 多种数据库支持:支持
MySQL
、SQL Server
、Oracle
等数据库。
-
使用案例:全球最大的博客系统WordPress的核心和Facebook的后端都是使用PHP代码进行编写的。
PHP的开发环境配置
- 集成开发环境(IDE)推荐:
VsCode
、Notepad--
、Notepad next
或Phpstorm
,最后一个对于初学者不推荐,因为其自动补全功能太强大了,容易让初学者产生依赖。我个人使用的是VsCode
。 - 环境安装:
- 软件推荐:PHP所需的开发环境主要包括PHP解释器、服务器软件和数据库管理软件三部分,安装这些软件的过程较为复杂并且容易出错,因此推荐使用
phpstudy
(小皮面板)进行一键式安装,适合于初学者。需要注意尽量将软件安装在C盘之外的硬盘上,这样可以省去后面的很多麻烦。 - 软件使用:
- 安装开发所需要的软件:在软件的界面中可以自选安装指定类型和版本的服务器软件、数据库管理系统和PHP。
- 启动服务器软件和数据库:直接在软件的首页即可选择启动指定的服务器软件和数据库管理系统,不过前提是这些服务器软件和数据库管理系统都已经安装完成。
- 网站站点创建:可以在软件的界面种中创建一个网站站点,此时软件会自动在电脑中的指定路径创建一个与域名相同的网站文件夹。在文件夹中,新建一个网页文件(例如HTML文件),即可生成一个网页。创建站点的一些内容设置需要提醒:
- 域名:随便指定即可,但是不建议使用
.com
和.cn
等常用域名后缀,否则由于域名重合可能影响正常访问网站。第二域名一般可以不填。 - PHP:可以指定该网站所使用的PHP版本。
- 域名:随便指定即可,但是不建议使用
- 软件推荐:PHP所需的开发环境主要包括PHP解释器、服务器软件和数据库管理软件三部分,安装这些软件的过程较为复杂并且容易出错,因此推荐使用
- 调试工具推荐:
xDebug
,该工具支持的调试功能包括断点调试、实时显示各个变量的值等,可以显著提升PHP开发的效率。
VsCode调试PHP代码遇到问题的解决方法:
1.尝试不同的PHP版本:有时候PHP版本与当前的计算机环境或浏览器版本不兼容导致代码无法运行。修改后如果还不行,就检查当前版本的PHP可执行文件的路径是否在计算机的环境变量中。
2.设置合适的网站到期时间:在phpstudy
中设置网站的到期时间,超过当前的时间(此时显示状态正常,否则显示过期)。
PHP的源代码文件
- 文件后缀名要求:PHP源代码文件的后缀名必须是
.php
。 - 文件中可以包含的内容:PHP源代码文件中可以包含HTML、CSS和JavaScript代码,但是HTML文件、CSS文件和JS文件中不能包含PHP代码。
- 内容的开头和结尾:以
<?php
开头,以?>
结尾。但是在只包含有PHP代码的文件中,则最好省略结尾的?>
。 - PHP代码在文件中的书写位置:可以放于一个PHP源代码文件内容中的任何位置。
PHP脚本的运行和停止
- 开始脚本运行:可以通过命令行命令或
VsCode
插件的方式来运行PHP源代码脚本。- 命令行运行:
- 准备工作:将需要使用的版本的PHP的可执行文件的路径添加到计算机的用户变量或系统变量中。
- 运行方式: 对于Windows操作系统,打开命令行后输入命令:
php php源代码文件路径
即可运行。
- VsCode中运行:在
VsCode
中安装code runner
插件,编写完PHP代码后可以点击该插件按钮运行脚本。
- 命令行运行:
- 停止脚本运行:
exit
:- 使用语法:
exit(消息字符串)
。消息字符串表示退出程序时输出的信息,可以省略。 - 使用情景:一般用于明确地表示脚本停止。
- 使用语法:
die
:- 使用语法:
die(消息字符串)
。该函数的消息字符串也可以省略。 - 使用情景:通常用于出错或产生异常时的脚本停止(虽然使用语法和
exit
函数完全相同)。
- 使用语法:
PHP的基本语法规范
- PHP代码语句结尾:所有PHP代码语句都以英文分号
;
结尾。 - PHP代码大小写:PHP中的变量名都对大小写敏感,但是关键字、函数名和类名对大小写不敏感。
PHP的输入输出
PHP中的输入:可以通过readline
函数、fgets
函数进行输入。
- readline函数: 获取用户输入的一段文本,其使用语法为
变量名 = readline("提示词")
。 - fgets函数:获取用户输入的一行文本,其使用语法为
变量名 = fgets(STDIN)
。
PHP中的输出:可以通过echo
函数、print
函数、var_dump
函数、print_r
函数来进行输出。
- echo介绍:
- 基本功能:用于输出一个或多个字符串。
- 使用语法:
echo expression1, expression2, ...
- 注意事项:严格意义上来说,echo不属于函数而是一种语言结构。
- print介绍:
- 基本功能:用于输出一个字符串。
- 与echo的区别:
print
只能输出一个字符串,始终带有一个返回值1
(可以不接收该返回值),效率低于echo
。 - 使用语法:
print expression
- var_dump介绍:
- 基本功能:输出一个格式化的字符串,其中包括变量的类型和值。对于数组和对象变量,还会输出变量的内部结构。
- 使用语法:
var_dump(expression1, expression2, ...)
- 与echo区别:由于该函数会输出变量的详细信息,因此一般只在PHP代码调试过程中使用。
- print_r介绍:
- 基本功能:格式化打印变量的内容并进行输出。
- 使用语法:
print_r(expression)
- 和var_dump区别:尽管两者都支持格式化输出变量,尤其适合于数组和对象类型的变量输出,但是
print_r
输出的结果更加简洁,而var_dump
输出的结果更加详细,因此具体使用哪一个需要在进行开发时根据实际需要确定。
PHP的注释
- 单行注释:PHP中的单行注释以
//
或#
(用的较少)开头; - 多行注释:PHP中的多行注释是用
/*
和*/
括起来的一部分。
PHP的变量
PHP变量的定义
-
变量的定义语法:
$变量名=初始值
-
变量的命名规范:
- 字符组成:变量的名称必须以
$
符号开头,其后的第一个字符只能是字母或下划线,变量中只能包含字符数字字符和下划线。 - 大小写要求:PHP中的变量名称对大小写敏感,不同大小写的变量不是同一个变量。
- 字符组成:变量的名称必须以
-
变量定义时的类型确定:PHP会自动根据变量的初始值将其转换为正确的数据类型。
-
特殊的变量写法:变量的定义前可包含两个或多个
$
符号,例如$a = "b"; $$a = 1
。此时,$$a
实际上就是$($a)
,会被解析为$b
。
PHP变量的作用域
PHP中的变量作用域也可以分为全局作用域、局部作用域和静态作用域。
- 全局作用域:
- 定义方式:在所有函数外部定义的变量具有全局作用域,该变量被称为全局变量。
- 基本特点:具有全局作用域的变量可以被当前PHP脚本中的任何位置访问。
- 变量使用:如果在函数中需要访问一个全局变量,则必须在该函数中使用
global
关键字声明该变量。
- 局部作用域:
- 定义方式:在函数内部定义的变量都是具有局部作用域,被称为局部变量。
- 基本特点:具有局部作用域的变量只有在函数内部才能访问。
- 静态作用域:
- 定义方式:在函数内部使用
static
关键字声明的变量具有静态作用域,该变量被称为静态变量。 - 基本特点:从第一次被使用开始,静态变量的值在每次函数执行完成后不会被销毁,下一次调用该函数时静态变量存储的还是上一次该函数执行结束时的值。
- 定义方式:在函数内部使用
PHP处理变量的函数
-
unset函数:
- 基本作用:用于删除某个指定名称的变量。
- 使用语法:
unset(要删除的变量名称)
- 扩展使用:该函数还可以用于删除数组中的某个指定元素和类的某个属性。
-
isset函数:
- 基本作用:用于判定某个名称的变量是否存在且值不为NULL。
- 使用语法:
isset(要查询的变量名称)
-
is_null函数:
- 基本作用:用于判定某个变量的值是否为NULL。
- 使用语法:
is_null(要查询的变量名称)
- 扩展使用:该函数常用于检查变量是否已被赋值或是否已被显式设置为NULL。
-
empty函数:
- 基本作用:用于判定某个变量的值是否为空。
- 使用语法:
empty(要查询的变量名称)
- 扩展使用:该函数会将以下值视为空:
""
(空字符串)、0
(整数)、0.0
(浮点数)、"0"
(字符串)、NULL
、FALSE
、array()
(空数组)以及未定义的变量。
PHP中的超级全局变量
PHP中的超级全局变量可以在项目的任意一个源代码文件中被使用。常用的全局变量包括 $GLOBAL
、 $_SERVER
、$_REQUEST
和 $_FILES
等。
$GLOBALS
: 包含了当前PHP中所有全局变量的关联数组,变量的名称就是数组的键。通过该超级全局变量可以查看和修改当前PHP脚本中所有全局变量的值。$_SERVER
:- 基本概念:由项目中的Web服务器负责创建,包含了服务器和执行环境的相关信息,不同的服务器软件提供的该超级全局变量的内容是不同的。
- 内容分类:
- 静态值:通常与服务器有关,不会随着每一次的请求而发生变化。
SERVER_NAME
:当前运行脚本所在的服务器的主机名。SERVER_SOFTWARE
:服务器标识字符串,返回服务器使用的软件相关信息。SERVER_PROTOCOL
: 请求的协议版本,通常是HTTP/1.0
或HTTP/1.1
。DOCUMENT_ROOT
: 当前运行的脚本所在的文档根目录。SCRIPT_NAME
:当前PHP脚本的路径。
- 动态值:这些值会根据每一次请求的不同而动态地发生变化。
REQUEST_METHOD
: 请求方法(如GET、POST等)。QUERY_STRING
: 查询字符串(如果有),在URL中?
之后的部分。REMOTE_ADDR
:发送请求的客户端IP地址。HTTP_USER_AGENT
:客户端浏览器的user-agent字符串。HTTP_REFERER
:引导用户代理到当前页的前一页的地址(如果存在)。
- 静态值:通常与服务器有关,不会随着每一次的请求而发生变化。
$_REQUEST
:- 基本概念:包含了通过
GET
、POST
和COOKIE
方式提交的所有数据,可以分别通过$_GET
、$_POST
和$_COOKIE
来获取数据来源。 - 使用的优点和缺点:
- 使用优点:
$_REQUEST
是一个非常方便的超级全局变量,适用于需要同时处理GET
、POST
和COOKIE
数据的情况。 - 使用缺点:由于该变量中包含多个来源的数据,因此在处理大量数据时可能会影响性能并且具有安全性问题。在大多数情况下,建议根据具体需求选择使用
$_GET
、$_POST
或$_COOKIE
这三个超级全局变量,以提高代码的可读性和安全性。
- 使用优点:
- 基本概念:包含了通过
$_GET
:- 基本概念:当用户提交一个表单,并且表单的
method
属性设置为GET
时,表单中的数据会被附加到URL的末尾,并作为查询字符串发送到服务器。 - 使用方法:以
GET
请求上传的表单中的数据的名称作为键,使用访问关联数组的方式访问表单的数据。
- 基本概念:当用户提交一个表单,并且表单的
$_FILES
:一个专门用于处理客户端发送给服务器的通过POST请求上传的文件的超级全局变量。- 使用方法:
- 当用户通过表单的形式使用POST请求将文件发送到服务器时,这些文件的信息就会被放入
$_FILES
数组中,通过$_FILE[文件名字符串]
的方式即可获取上传的文件。 - 获取了指定的文件之后之后通过
文件对象名[属性名]
可以查看文件的各个属性,常用的属性有下面这些:name
:查看该文件的文件名。type
:查看该文件的MIME类型(参加本文附录4可以找到MIME类型的详细介绍)。size
:查看该文件的大小,以字节为单位,常用于检测文件大小是否过大。tmp_name
:查看该文件的临时文件名。当文件上传到服务器时,PHP 会将其存储在一个临时目录中,并生成一个唯一的临时文件名。该属性通常用于后续将上传的文件从临时目录移动到目标目录。error
:查看上传该文件过程中的错误代码。
- 当用户通过表单的形式使用POST请求将文件发送到服务器时,这些文件的信息就会被放入
- 注意事项:
- 上传的文件名称变为一长串数字:如果上传的文件名中包含了非ASCII码字符(例如中文字符),则
$_FILES
可能将该文件名转换为一长串数字,这是出于安全性考虑。
- 上传的文件名称变为一长串数字:如果上传的文件名中包含了非ASCII码字符(例如中文字符),则
- 使用方法:
PHP中的常量
PHP常量的基础知识
- 基本概念:常量是指定义之后在脚本的任何地方都不可以被改变的量。
- 常量命名:
- 大小写规范:常量命名需要严格区分大小写,但是无需
$
符号。 - 推荐写法:推荐对常量名进行大写,与变量名进行更好区分。
- 大小写规范:常量命名需要严格区分大小写,但是无需
- 定义方式:
- 使用define关键字进行定义:
define(常量名, 常量值)
,其中的常量名用字符串进行表示。 - 使用const关键字进行定义:
const 常量名 = 常量值
。相较于define
关键字的定义方式,这种方式可以用于类常量成员的定义,而define
不能。
- 使用define关键字进行定义:
- 常量的作用域:常量默认是全局可用的。
PHP中的常量函数
constant
:- 基本作用:获取指定常量的值。
- 使用语法:
constant(常量名)
get_define_constants
:- 基本作用:获取当前开发者定义过的所有常量。
- 使用语法:
get_define_constants(true)["user"]
PHP中的魔术常量
- 魔术常量的概念:值会随着其在代码中的位置的改变而改变的预定义常量。
- 常用的魔术常量:
- 源代码文件的当前行号:
__LINE__
; - 文件的完整路径和文件名:
__FILE__
; - 文件所在的目录:
__DIR__
; - 当前正在执行的最内层函数的名字:
__FUNCTION__
; - 当前代码所处于的类的名字:
__CLASS__
; - 当前的命名空间:
__NAMESPACE__
; - 当前的命名空间、类名和函数名:
__METHOD__
; - 当前使用的trait方法的名称:
__TRAIT__
;
- 源代码文件的当前行号:
PHP中的数据类型
PHP数据类型分类
-
字符串:用
string
进行类型表示。可以使用单引号或者双引号来表示一个字符串,但是使用单引号和双引号存在一定区别:- 单引号字符串:单引号中放入变量名,字符串读取时不会对该变量名进行解析,也就是变量名被作为一个子串放入字符串中。
- 双引号字符串:双引号中放入变量名,字符串读取时会对该变量名进行解析,将其转换为变量的值,再作为子串放入字符串中。
-
整数:使用
integer
进行类型表示。和其他语言中整数的概念相同,支持十进制、八进制(前缀是0
)和十六进制(前缀是0x
),但是正式的编程过程中很少使用其他的进制。 -
浮点数:使用
double
进行类型表示。有小数部分或指数部分的数字,和其他编程语言中浮点数的概念相同。 -
布尔类型:用
boolean
进行类型表示,只有真(true
)和假(false
)两个可能取值。 -
数组:使用
array
进行类型表示。可以分为一维数组和多维数组,用于表示一组数据。 -
对象:使用
object
进行类型表示。与类与封装有关,与C++中对象的概念一致。 -
NULL:使用
NULL
进行类型表示。表示变量没有值,可以通过给变量赋值NULL
来清空该变量的值。 -
资源类型:
- 基本概念:资源类型是一种特殊类型的变量,使用
resource
进行类型表示。保存了外部资源的一个引用。在连接数据库、打开一个文件时,返回结果就是一个资源类型。 - 判定语法:
is_resource(对象名)
- 获取资源的类型:
get_resource_type(资源对象名)
- 基本概念:资源类型是一种特殊类型的变量,使用
PHP数据类型获取
- gettype函数:只是获取一个变量的数据类型,但是不获取值,也不直接输出。
- var_dump函数:作为一个输出函数,输出结果中包含有变量的数据类型。
PHP的运算
PHP算术运算
- 六种常用算术运算:PHP中可以分别使用
+
、-
、*
、?
、/
和%
来分别表示加法、减法、乘法、除法和取余运算。 - 整数除法运算:PHP中可以使用
intdiv
函数来计算两个整数的整除结果,使用语法为intdiv(被除数、除数)
。 - 递增递减运算符:PHP支持
++
递增运算和--
递减运算,也像其他的编程语言一样支持前置和后置两种方式。 - 扩展赋值运算:PHP中也支持类似于其他语言的
+=
、-=
、*=
、/=
、%=
这类扩展赋值运算符。
PHP比较运算
- 基本比较运算符:PHP中支持
==
、<
、>
、<=
、>=
、!=
六种基本的比较运算符。 - 特殊的比较运算符:
===
:绝对等于运算符,用于判定两边是否不仅值相等,并且数据类型也相同。<>
:不相等运算符,作用和!=
相同。!==
:不绝对等于运算符,用于判定两边是否不满足绝对等于。
PHP逻辑运算
- 基本的逻辑运算符:PHP中支持
&&
(与)、||
(或)、!
(非)三种逻辑运算符。 - 逻辑运算符的另一种表达方式:
- PHP中可以使用
and
表示与,or
表示或。 - 另外,可以使用
xor
表示异或,即两者中是否有且只有一个为1。
- PHP中可以使用
PHP其他特殊运算
- 三元运算符:三元运算符
?:
的语法和功能和其他编程语言中的三元运算符语法和功能完全相同。 - 空合并运算符:
- 基本作用:简化处理可能为
NULL
的变量或数组元素。判定一个变量是否未定义或值为NULL
,如果是的话则返回一个默认值,否则直接返回该变量的值。 - 使用语法:
变量名 ?? 默认值
。
- 基本作用:简化处理可能为
- 组合比较运算符:
- 基本作用:比较两个整数、浮点数或字符串的大小。
- 使用语法:
a <=> b
。如果a < b
则返回-1
,如果a = b
则返回0
,如果a > b
则返回1
。
PHP的流程控制
PHP条件判断语句
-
if语句:PHP中的
if
语句的语法和C++中的if
语句的语法相同,因此不过多赘述。相同的还有if-else
语句和if-elseif-else
语句。 -
switch语句:PHP中的
switch
语句与C++中的switch
语句的语法完全相同,也包含多个case
,每个case
最后都需要break
,如果都不匹配也会需要默认情况default
。
PHP循环语句
-
三类循环语句:
-
for循环:PHP中的
for
循环的语法和C++中的for
循环语法基本相同,但是使用循环变量时不需要进行类型声明。 -
while循环:PHP中的
while
循环的语法与C++中的while
循环语法完全相同。 -
do-while循环:PHP中的
do-while
循环的语法与C++中的do-while
循环语法完全相同。
-
-
循环结束关键字:PHP中支持
continue
和break
两种循环控制关键字,分别用于终止一次循环和终止后续的所有循环。
PHP的包含文件
- 包含文件的概念:
- 基本概念:在当前PHP源代码文件中引入其他的PHP源代码文件、HTML源代码文件或文本文件等外部文件。
- 包含的实质:将被导入的外部文件中的内容直接复制到当前的PHP源代码文件中。
- 常用场景:一般用于包含公共方法和公共界面等,例如
header
、footer
、sider
等网页通用部分。 - 包含文件的代码实现:包含文件的语句主要有两个关键字,
require
和include
。- 基本语法:
require 文件名字符串
和include 文件名字符串
- 两者的联系和区别:
require
和include
处理错误的方式不同,其他的内容都完全相同。- require语句处理错误的方式:
- 生成一个致命错误,在错误发生后脚本会停止执行。
- 如果需要引入的文件是必需的,且缺少该文件会导致脚本无法正常运行,则应该使用
require
。在一般情况下,都更推荐使用require
进行文件包含。
- include语句处理错误的方式:
- 生成一个警告,在错误发生后代码仍然会继续执行。
- 如果被包含的文件是可选的,并且即使缺少该文件脚本也可以继续执行,则可以使用
include
。
- require语句处理错误的方式:
- require_once函数 和 include_once函数:
- 基本作用:仍然用于包含某个指定的文件,但是对于已经包含了的文件不会进行重复包含。
- 使用场景:这两种方式主要用于引入函数库和类定义的代码。
- 基本语法:
PHP的函数
PHP函数分类
PHP中的函数也可以分为内置函数和自定义函数两大类。
- 内置函数:PHP语言本身提供的一系列预定义函数。
- 自定义函数:开发人员自行设计和定义的函数。
PHP自定义函数
- 定义语法:
function 函数名(参数列表)
{
...函数体...;
}
- 函数命名规范:函数的名称要以字母或下划线进行开头。
- 参数的数据类型:PHP中的自定义函数的参数列表中无需指定参数的数据类型。但是在有需要的情况下,仍然可以强行指定,指定语法和C++中的函数相同(例如,想要指定传入的参数类型只能是整型
int
,则传参列表中在参数名前加上int
关键词即可)。这种方式称为严格模式,使用前需要在函数定义的上一行增加一条代码:declare(strict_types = 1)
- 函数的返回值:通过
return
关键字进行传回函数的执行结果。 - 获取函数传入的所有参数:
- PHP中传给一个函数的参数可以与该函数参数列表中的参数个数或类型不匹配。
- 当传入的参数个数比参数列表中的参数个数要多,PHP会自动忽略多出来的参数;当传入的参数个数比参数列表中的参数个数要少,则PHP会自动将没有传入的参数赋值为
NULL
。 - 当传入的参数和参数列表中的参数类型不匹配,则PHP会自动进行类型转换。
- 当传入的参数个数比参数列表中的参数个数要多,PHP会自动忽略多出来的参数;当传入的参数个数比参数列表中的参数个数要少,则PHP会自动将没有传入的参数赋值为
- 可以在一个函数的函数体中使用
func_get_args()
获取传入该函数的所有参数(以数组的形式),还可以使用func_num_args()
函数获取传入该函数的参数个数。
- PHP中传给一个函数的参数可以与该函数参数列表中的参数个数或类型不匹配。
PHP异步函数
-
基础概念:
- 异步操作的概念:异步操作是指在执行过程中不会阻塞主线程,允许其他任务继续执行的操作。异步操作一般会涉及到与外部资源(如网络、磁盘)的交互,这些交互可能会花费较长的时间,并且可能会阻塞主线程的执行。通过将这些操作设计为异步操作,可以避免阻塞主线程,从而提高应用程序的响应性和性能。
- Fiber对象:
Fiber
对象是PHP中用于实现纤程(轻量级线程)的类,允许代码在执行过程中暂停和恢复。
-
async函数:
- 基本功能:使用
async
关键字声明的函数是一类特殊的函数,因为该函数内部允许使用await
关键字来等待异步操作的完成。 - 使用语法:
async function (参数列表) {...函数体...}
- 返回值:该函数返回一个
Fiber
(纤程)对象,意味着该函数可以在执行的过程中暂停和恢复。
- 基本功能:使用
-
await关键字:
- 基本作用:该关键字可以等待一个异步操作的完成。其会暂定当前
Fiber
对象的执行,直到异步操作完成并返回结果。 - 使用位置:只能在
async
函数中使用。 - 使用优点:可以编写更简洁、更易读的异步代码,而不需要使用传统的回调函数或复杂的Promise链。
- 基本作用:该关键字可以等待一个异步操作的完成。其会暂定当前
PHP时间戳函数
- 时间戳的获取:
time()
:该函数用于获取当前的Unix时间戳,返回一个十位整数,表示自1970年1月1日00:00:00 UTC
以来的秒数。此时间戳仅精确到秒级。microtime(true)
:该函数返回一个浮点数时间戳,精确到微秒级别。与time()
函数相比,该函数提供了更高的时间精度,适用于需要精确时间测量的场景。mktime(h, mi, s, mo, d, y)
:该函数接受六个参数,分别表示小时、分钟、秒、月、日和年。所有参数都是可选的,如果省略,则默认为当前时间。
- 时间戳和时间字符串相互转化:
- 将时间戳转换为指定格式的字符串:
- 使用语法:
date(模板字符串, 时间戳)
。模板字符串定义了输出的日期和时间格式,时间戳是可选参数,默认为当前时间。 - 模板字符串中的格式化字符:
Y
:表示四位数的年份(例如:2023)。m
:表示两位数的月份(例如:01表示一月)。d
:表示两位数的日期(例如:05表示5日)。H
:表示二十四小时制的小时(例如:14表示下午2点)。h
:表示十二小时制的小时(例如:02表示下午2点)。i
:表示两位数的分钟(例如:30表示30分)。s
:表示两位数的秒数(例如:45表示45秒)。
- 使用语法:
- 将字符串转换为时间戳:
- 使用语法:
strtotime(时间字符串, 基准时间戳)
- 参数介绍:
- 时间字符串:需要遵循一定的格式,例如
"2024-08-09"
、"next Monday"
、"+3 day"
等。 - 基准时间戳:表示基准时间,默认为当前时间。
- 时间字符串:需要遵循一定的格式,例如
- 使用语法:
- 将时间戳转换为指定格式的字符串:
PHP文件目录函数
-
mkdir函数:
- 基本作用:创建一个目录(文件夹)。
- 使用语法:
mkdir(pathname, recursive)
- 参数介绍:其中
pathname
表示需要创建的目录名字符串;recursive
是可选参数,用一个布尔值表示且默认为false
,如果设置为true
,则会递归创建路径中不存在的所有父目录。
-
is_dir函数:
- 基本作用:判定某个字符串是否表示一个计算机上已经存在的文件目录。该字符串可以是绝对路径或相对于当前工作目录的路径。
- 返回值:一个布尔值,表示当前字符串是否表示一个路径。
- 使用情景:有时候需要判定当前某个文件夹是否存在,如果不存在则创建,就会使用到这个函数。
-
basename函数:
- 基本作用:返回一个路径字符串中的文件名部分,适用于只需要文件名而不需要路径的情况。
- 使用语法:
string basename(path , suffix)
- 参数介绍:
path
表示需要处理的文件路径。suffix
是可选参数,当文件名以suffix
结尾时,这一部分结尾会被去掉。
-
pathinfo函数:
- 基本作用:用于解析一个文件路径,获取一个文件路径中的各个部分。
- 使用语法:
pathinfo(path, options)
。path
表示需要解析的文件路径;options
是可选参数,其每一个可取的值都是一个常量(无需加引号):PATHINFO_DIRNAME
: 返回目录部分。PATHINFO_BASENAME
: 返回文件名(包括扩展名)。PATHINFO_FILENAME
: 返回文件名(不包括扩展名)。PATHINFO_EXTENSION
: 返回文件扩展名。PATHINFO_ALL
: 返回所有路径信息(默认值),是一个包含所有路径信息的关联数组。
-
move_uploaded_file函数:
- 基本作用:将上传的文件从PHP上传文件的临时目录移动到目标目录。
- 使用语法:
move_uploaded_file(临时文件名, 目标目录字符串)
- 返回值:一个布尔值,表示文件移动是否成功。
PHP命令行函数
shell_exec()
:- 基本功能:执行Windows命令行的命令语句,并返回输出结果中最后一行的内容。
- 使用语法:
shell_exec(需要执行的命令字符串)
- 返回值:执行成功时,返回命令行输出结果中的最后一行;执行失败时,返回
NULL
;如果命令行执行本身没有输出,则返回一个空字符串。
escapeshellarg()
:- 基本功能:将一个字符串转换为可以安全传递给命令行的形式。它确保字符串中的特殊字符(如空格、引号、重定向符号等)被正确地转义,以避免命令行解释它们。
- 使用语法:
escapeshellarg(需要转换的字符串)
- 返回值:完成安全转义之后的字符串。
PHP文件函数
-
打开文件函数
fopen
:- 基本语法:
文件指针名 = fopen(文件路径, 打开方式)
- 打开方式参数:如果以只读方式打开文件,用打开方式以"
r
"进行表示。 - 函数特点:
- 允许逐字节或逐行读取文件,从而更有效地管理内存。
- 返回一个文件指针资源,该文件指针可以配合其他的函数进行其他的文件操作。
- 基本语法:
-
关闭文件函数
fclose
:fclose(文件指针名)
-
读取文件内容的函数
file_get_content
:- 基本功能:一次性读取文件的内容,并将文件内容作为字符串返回。可以读取不是非文本文件的内容。
- 简单语法:
file_get_content(文件路径)
- 函数特点:可以实现快速且简单的文件读取,但是可能由于需要读取整个文件,导致占据较多的内存空间。
- 返回值:返回文件内容字符串,如果读取失败返回布尔值
false
。
PHP的数组
PHP数组的基础知识
数组的分类:PHP中的数组可以分为索引数组和关联数组两种类型,两种数组类型都支持构建多维数组。
- 索引数组:以连续整数作为数组元素的索引,类似于C++中数组的概念。
- 关联数组:索引可以取任何数据类型的值,并且在逻辑上这些索引是可以不连续的。
数组的默认索引:PHP数组中的元素可以不设置索引,而直接设置一个值,此时PHP就会对那些没有设置索引的元素从0
开始按顺序分配索引。
数组的负索引:从PHP 7.4.7开始,PHP中的数组开始支持负数索引,其使用规则和Python语言的负数索引相同。
数组的定义:
- 数组定义方式1:
数组名 = array(元素1,元素2,元素3...)
- 数组定义方式2:
数组名 = [元素1, 元素2,元素3...]
数组元素个数获取:可以使用 count(数组名)
来获取数组中的元素个数。
数组的遍历:
- 基于for循环的数组遍历:对于索引数组,可以使用
count
函数获取其中的元素个数,然后使用for
循环进行遍历。 - 基于foreach循环的数组遍历:
- 只需要获取数组元素的值:
foreach(数组变量名 as 数组元素变量名)
- 获取数组中的每一组键值对:
foreach(数组变量名 as 键名 => 值名)
- 只需要获取数组元素的值:
数组的输出:可以使用 var_dump
函数或 print_r
函数格式化输出数组中的内容。
PHP数组的运算
PHP数组支持合并运算和判等运算。
- 数组的合并运算:
- + 运算符合并:
- 使用语法:
合并后的数组名 = 数组1 + 数组2
- 合并特点:通过这种方式合并多个数组时,如果遇到多个数组中存在重复的键,则只会保留该键在第一个数组中对应的值。
- 使用语法:
- array_merge函数合并:
- 使用语法:
合并后的数组名 = array_merge(数组1, 数组2)
- 合并特点:通过这种方式合并多个数组时,如果遇到多个数组中存在重复的键,则只会保留该键在最后一个数组中对应的值,这一点刚好与通过
+
运算符合并数组相反。
- 使用语法:
- + 运算符合并:
- 数组的判等运算:
==
判等:比较数组的键和值是否相同,不考虑键的顺序和值的数据类型。===
判等:比较数组的键和值是否相同,同时考虑键的顺序和类型。
PHP数组的函数
-
向数组中添加元素:
- array_push():
array_push(数组名, 新元素)
。可以将一个或多个元素添加到数组的末尾。 - array_unshift():
array_unshift(数组名, 新元素)
。可以将一个或多个元素添加到数组的开头。
- array_push():
-
删除数组中的元素:
- array_pop():删除并返回数组中的最后一个元素,返回被删除的元素的值(不返回键)。
- array_shift():删除并返回数组中的第一个元素,返回被删除的元素的值(不返回键)。
-
查找数组中的键和值:
- in_array()函数:
- 基本功能:检查当前数组中是否存在某个指定的值。
- 使用语法:
in_array(待查找的元素, 数组名)
- 返回值:一个布尔值,表示该值是否存在。
- array_values()函数:
- 基本功能:获取数组中的所有值构成的一个新的数组。
- 使用语法:
array_values(数组名)
- array_key_exists()函数:
- 基本功能:检查数组中是否存在指定的键。
- 使用语法:
array_key_exists(待查找的元素, 数组名)
- 返回值:一个布尔值,表示待查找的键是否存在。
- array_keys()函数:
- 基本功能:获取数组中的所有键构成的一个新的数组。
- 使用语法:
array_keys(数组名)
- 扩展语法:
- 查找一个数组中指定值的所有键:
array_keys(数组名, 指定的值)
。 - 查找一个数组中指定值的所有键并采用严格模式:
array_keys(数组名, 指定的值, 一个表示是否采用严格模式的布尔值)
。严格模式要求值相等且数据类型相同,默认为false
。
- 查找一个数组中指定值的所有键:
- array_search()函数:
- 基本功能:在数组中搜索指定的值,并返回该值对应的键。
- 返回值特点:如果有多个结果满足条件,则只返回第一个结果。
- 使用语法:
array_search(待查找的值, 数组名)
- in_array()函数:
-
array_slice()函数:
- 基本功能:从数组中连续提取多个元素构成一个新的数组。
- 使用语法:
array_slice(数组名, 开始提取元素的位置, 提取元素的个数)
。- 提取元素的个数可以省略,默认取从开始位置后的所有元素。
- 针对数值数组,该函数还可以有第四个参数,这个参数是一个布尔值:如果为
true
则表示新生成的数组保留原数组的键名称,如果为false
则表示使用从0
开始默认生成的新的键。
-
array_reverse()函数:
- 基本功能:颠倒当前数组中的所有元素的顺序。
- 使用语法:
array_reverse(数组名)
-
array_unique()函数:
- 基本功能:移除数组中的所有重复值。
- 使用语法:
array_unique(数组名)
-
数组相关的统计函数:
- max/min()函数:求数组中的最大值或最小值,传入的参数是数组名。
- sort()函数:对数组元素进行升序排序。该函数完成排序后返回一个布尔值
true
。 - rsort()函数:对数组元素进行降序排序。该函数的返回值也是
true
。 - array_sum():对数组元素进行求和。
- array_product():对数组元素进行求积。
PHP的字符串
PHP字符串连接运算
- 字符串的连接:可以通过
.
来连接两个运算符,使用语法为字符串1.字符串2
。 - 字符串的扩展赋值运算:可以使用
.=
来连接两个字符串,实现将两个字符串连接后的结果赋值给第一个字符串。
PHP中的字符串函数
-
字符串长度获取:
- strlen():用于获取一个字符串的长度。
- 注意事项:在默认的单字节字符集(如ASCII)中,一个汉字的长度为
1
,而在多字节字符集(如UTF-8)中,一个汉字的长度为3
。
- 注意事项:在默认的单字节字符集(如ASCII)中,一个汉字的长度为
- strlen():用于获取一个字符串的长度。
-
字符串子串查找:
- strpos():在一个字符串内查找某个字符或某个字符串的首字符位置,
- 使用语法:
strpos(字符串, 待查找的字符或子串)
- 返回值:待查找的字符第一次出现的位置或
false
(表示字符串中不存在查找内容)。
- 使用语法:
- stripos():功能和
strpos
相同,但是不区分英文字符的大小写。 - strrpos():功能和
strpos
类似,但是返回最后一次出现的位置。 - strripos():功能和
strrpos
相同,但是不区分英文字符的大小写。
- strpos():在一个字符串内查找某个字符或某个字符串的首字符位置,
-
字符串拆分和拼接:
- explode():该函数将按照指定的分隔符,将一个字符串打散成多个元素并放入一个数组。
- 使用语法:
explode(分隔符, 原始字符串)
。
- 使用语法:
- implode():将一个数组中的所有元素按照指定的分隔符合并为一个字符串。
- 使用语法:
implode(分隔符, 原始数组)
。
- 使用语法:
- explode():该函数将按照指定的分隔符,将一个字符串打散成多个元素并放入一个数组。
-
字符串中字符大小写转换:
- strtoupper():将一个字符串中的所有英文小写字母转换为大写字母。
- strtolower():将一个字符串中的所有英文大写字母转换为小写字母。
- ucfirst():将一个字符串的首字符的英文小写字母转换为大写字母。
- lcfirst():将一个字符串的首字符的英文大写字母转换为小写字母。
-
字符串子串替换:
- str_replace():将字符串中的某个子串替换为另一个字符串,
- 使用语法:
str_replace(需要查找的子串, 替换的内容, 原始字符串)
。
- 使用语法:
- str_replace():将字符串中的某个子串替换为另一个字符串,
-
字符串内容反转:
- strrev():将字符串中的字符顺序颠倒过来。
-
字符串去除两端空格:
- trim():将字符串两端多余的空格全部删除。
-
字符串的切片:
- substr():从一个字符串中截取其中的一个子串。
- 使用语法:
substr(原始字符串, 开始截取的位置, 截取个数)
- 使用语法:
- mb_substr():该函数的作用和
substr
函数相同,但是可以用于处理多字节字符(如中文)。- 注意事项:需要额外安装
mbstring
库后即可使用该函数。
- 注意事项:需要额外安装
- substr():从一个字符串中截取其中的一个子串。
PHP中的EOF定界符
功能介绍:
- 基本作用:
EOF(End Of File)
用于定义一个字符串,它可以跨越多行,并且不需要在每行末尾使用引号或连接符。 - 使用场景:在需要插入大量
HTML
或其他格式化文本时非常有用,因为它可以提高代码的可读性并减少输入错误。
使用语法:
$string = <<<EOF
这是多行字符串的一部分。
这仍然是在同一个字符串中。
EOF; // 结束 EOF 定界符
注意事项:
- 表示定界符的符号名:
EOF
三个字符可以使用任意的其他字符串替代,只要保证开头和结尾的字符串完全相同且不在这个跨行字符串中出现即可。例如,可以使用EOT
、EOD
等等字符串替代。 - 结束定界符的规范:结束定界符
EOF
必须单独成行,且前面不能有任何空白或制表符,最后需要加上一个英文分号结尾。 - 变量和HTML标签解析:位于这个长字符串中的已经被定义好的PHP变量和包含的HTML标签可以被正常解析(但是函数名称不可以)和进行渲染。需要注意的是,变量名称需要与后面的内容使用空格、换行或HTML标签进行隔开才会生效。
- 引号无需转义:如果跨行字符串中包含单引号或双引号,也无需使用转义表示方法,可以直接输出跨行字符串中的单引号和双引号。
PHP中常用的字符串
- uniqid(): 生成一个唯一的ID。这个ID通常是一个基于当前时间微秒数的字符串,因此它在大多数情况下是唯一的。常用于生成临时文件名、会话ID、唯一标识符等场景。
- PHP_EOL常量:常量
PHP_EOL
表示一个换行符,PHP会根据当前的操作系统自动选择换行符。该常量常与字符串进行连接,用于将字符串分为多行输出。
PHP的类和对象
PHP类和对象的基本概念
- 类的定义方式:使用
class
关键字进行定义,具体定义方式为:class 类名 {类的内容定义}
。类的内容定义包含了类的属性和类的方法。 - 类的实例化方式:使用
new
关键字来实例化一个类的对象,具体的实例化语法与C++中类的实例化语法相同。 - 类成员的调用:可以通过
对象名->成员名
的形式,对类的成员(包括属性和方法)进行调用。 - this对象:类中可以使用
$this
获取当前对象自身。 - 类的访问权限控制:与C++中类似,PHP中使用
public
、private
和protected
对类进行访问权限控制。public
:公有的类成员,可以在任何地方被访问。protected
:受保护的类成员,可以被该类内部的成员函数和该类的派生类内部的成员函数访问。private
:私有的类成员,只能被该类内部的成员函数访问。
- PHP中的构造函数:
- 基本语法:
public function __construct(参数列表) {函数体}
- 注意事项:需要再次指出,构造函数不能有返回值。
- 基本语法:
- PHP中的析构函数:
- 使用语法:
public function __destruct() {函数体}
- 注意事项:析构函数一般用不上,因为PHP有一套自动的资源释放体制。
- 使用语法:
- PHP中类的静态属性:
- 基本概念:无需对类进行实例化即可直接调用的属性,对静态变量的操作会影响这个类的所有对象。
- 定义语法:在类的成员变量声明时使用
static
关键字,例如public static test
。 - 调用语法:
- 通用方式:
类名 :: 静态变量名
- 类的内部成员函数的调用:
self :: 静态变量名
- 通用方式:
- PHP中的类常量:
- 使用场景:该类的所有对象共有的一个相同的属性。
- 与静态属性的区别:静态属性可以修改,但是类常量在初始化后就不能再修改了。
- PHP中类的静态方法:
- 定义语法:在类函数的定义中加上
static
关键字,例如public static function sayHello()
。 - 调用语法:
类名 :: 静态函数名
- 与普通成员方法的区别:类的静态方法只能调用类的静态属性,而不能调用普通的成员属性。
- 定义语法:在类函数的定义中加上
PHP中的类的继承
- 基本语法:
class 子类名 extends 父类名
- 注意事项:
- 属性继承:子类会继承父类的所有属性,包括私有属性,虽然私有属性只有在父类内部才能访问。
- 方法覆盖:子类中会继承父类中的所有非私有方法,但是子类中如果定义与父类同名的方法,将会执行子类中的方法,这种情况被称为方法覆盖。另外需要说明的是,PHP中不允许有相同名字的方法,因此不存在类似于C++中的方法重载的概念。
- 构造函数:如果子类没有专门定义构造函数,将会隐式调用父类的无参构造函数。
- 不可被覆盖的方法:如果将父类中的一个方法声明为
final
,则该方法无法被子类中的方法覆盖。但是,final
关键字不能用于修饰类的属性。 - 只支持单继承:PHP中不支持多继承,即一个类只能继承一个类。
- 调用父类的成员:如果父类的成员被子类覆盖,但是想要调用父类的成员,则可以使用
parent::
父类成员名来进行调用。
- 静态延迟绑定:
- 之前学习静态方法时,我们知道在类的成员函数可以通过
self::静态方法名
的方式调用静态方法。 - 在使用继承的情况下,这种方式实际上是由定义该静态方法的类来调用该静态方法,有时候我们不希望这样做,而是想要调用该方法的类直接执行该静态方法,则可以使用
static::静态方法名
的方式。 - 也就是说,
self::
和static::
的区别就是调用调用静态方法的类的。这种语法实际的使用情况很少。
- 之前学习静态方法时,我们知道在类的成员函数可以通过
PHP中的接口
- 基本概念:接口是指一组类常量和方法的集合,其本身并不是类,因此无法被实例化。
- 具体作用:可以用于指定某个类必须具有哪些常量和实现哪些方法,但是不需要定义这些方法的具体实现内容。通过接口可以定义一些规范,让代码更有条理。
- 访问权限:接口中所有成员的访问权限必须都设置为
public
。 - 定义语法:
interface 接口名 {接口内容定义}
。接口内容定义中只能包含类常量和各种方法的声明,但是不包括这些方法的实现。 - 类如何使用接口:
- 类为什么要使用接口:类使用接口表示该类实现了接口中声明的一系列常量和方法。
- 定义实现接口的类的语法:
class 类名 implements 接口名 {类的内容定义}
。类的内容定义中需要实现接口定义中的所有方法。另外,一个类可以实现多个接口,implements
关键字后面可以接多个用逗号隔开的接口名称。
PHP中的抽象类和抽象方法
- 基本作用:定义了一种类的约束或者规范。
- 使用情况:适合较大型的项目或库使用。
- 抽象类:
- 定义方法:
abstract class 抽象类名 {抽象类具体内容定义}
- 基本特点:
-
只能继承无法实例化:抽象类是一种特殊的类,其只能被继承,无法被实例化。可以说,抽象类就是为了让子类继承,制定一种类的规范而存在的。
-
抽象类的子类的规范:
- 抽象类用于定义一组相关的方法,但是这些方法的具体实现由继承它的子类来完成。
- 对于抽象类中的抽象方法,子类继承了抽象类之后,必须实习抽象类中的所有抽象方法,非抽象方法则不一定需要给出实现。
- 如果子类未能实现一个抽象类中的所有抽象方法,则子类也需要声明为一个抽象类。
-
可以包含各种类型的方法:抽象类可以包含抽象方法和普通方法。
-
- 和接口的区别:
- 抽象类中可以包含普通方法以及对应的实现,但是抽象方法必须使用
abstract
关键字进行声明;接口中不用专门使用abstract
关键字,但是不能包含任何方法的实现。 - 一个类只能继承一个抽象类,但是可以实现多个接口。
- 抽象类可以有构造函数,而接口没有构造函数。
- 抽象类中可以包含普通方法以及对应的实现,但是抽象方法必须使用
- 定义方法:
- 抽象方法:
- 使用语法:
abstract 访问权限控制符 function 方法名(参数列表)
- 基本特点:
- 抽象方法是没有具体实现的方法,只有方法的声明,而不需要方法体。
- 抽象方法只能存在于抽象类中,而不能放在普通的类中。
- 抽象方法的访问权限只能是
protected
或public
,不能使用private
。
- 使用语法:
PHP中的trait代码复用
- 基本作用:trait代码复用用于解决类的单一继承不够的问题,表示一组特征。一个类可以同时使用多个trait。
- 使用场景:把最常用的、通用的代码抽离出来成为一个trait。
- 使用语法:在使用trait的类的内容定义中第一句写上
use trait名称
,各个trait
之间使用逗号进行分隔,例如use A, B
。 - 和类的继承的区别:
- trait中不能包含任何类常量,并且trait本身和接口和抽象类一样无法被实例化。
- 一个类可以使用多个trait。
- 注意事项:
- trait中可以定义抽象方法,如果这样做的话使用trait的类就要实现trait中定义的抽象方法。
- trait中可以使用静态属性和静态方法。
- trait中可以使用其他的trait。
- 在使用trait的类是继承得到的情况下,trait中可以使用
parent::
。
- 方法同名冲突:
- 冲突情景:当一个类同时使用了多个trait,并且这些trait中存在同名的方法时,使用同名的方法就会发生冲突(不知道应该使用哪一个trait的)。
- 解决方法:可以使用
insteadof
关键字或as
关键字来解决冲突。- 使用insteadof关键字解决冲突:如果两个trait分别为
A
和B
并且存在冲突,冲突的方法名为test
,则在类中使用两个trait时可以通过这样的方式避免冲突:use A, B { A::test insteadof B;}
,这表示当使用test
方法时,会使用A
中的test
方法而不是B
中的test
方法。 - 使用as关键字解决冲突:
as
关键字的作用是给冲突的方法其一个别名,从而避免冲突,其使用语法为:use A,B {A::冲突的方法名 as 方法别名;}
。这样,当需要使用A
中的该方法时,可以直接通过别名进行调用。 - 修改类的方法的访问权限:在
as
和方法别名之间,还可以加上一个访问权限控制符,这样做可以修改该方法原有的访问权限。
- 使用insteadof关键字解决冲突:如果两个trait分别为
- 属性同名冲突:
- 属性同名冲突在PHP中没有直接给出解决方法,因此只能避免使用的多个trait中含有相同名称的属性。
- 如果属性同名但是值相同,则不会发生冲突。
PHP中的DateTime对象
-
基本介绍:PHP中用于处理日期和时间的强大对象。它提供了丰富的功能,使得日期和时间的操作更加直观和灵活。
-
创建DateTime对象:
- 使用构造函数创建:
- 基本语法:
$对象变量名 = new DateTime(时间日期字符串)
- 参数介绍:时间日期字符串的格式通常为
xxxx-xx-xx xx:xx:xx
,例如"2024-08-09 14:30:00"。
- 基本语法:
- 使用date_create()函数创建:
- 基本语法:
$对象变量名 = date_create(时间字符串)
- 参数介绍:时间字符串的格式通常为
xxxx-xx-xx xx:xx:xx
。
- 基本语法:
- 使用构造函数创建:
-
获取DateTime对象的信息:
- 获取DateTime对象的时区信息:
- 基本语法:
DateTime对象名 -> getTimezone()
。 - 返回值:一个
DateTimeZone
类的对象。- 获取时区的名称:
DateTimeZone对象名 -> getName()
- 获取时区的地点:
DateTimeZone对象名 -> getLocation()
- 获取时区的名称:
- 基本语法:
- 获取DateTime对象的时间戳:
DateTime对象名 -> getTimestamp()
- 获取DateTime对象的时区信息:
-
设置DateTime对象的信息:
- 时区设置:
setTimezone(时区对象)
。函数参数是一个DateTimeZone
对象,返回修改后的DateTime
对象。 - 日期设置:
setDate(年, 月, 日)
。该函数返回修改后的DateTime
对象。 - 时间设置:
setTime(时, 分, 秒, 毫秒)
。函数参数中的秒和毫秒两个参数可选,返回修改后的DateTime
对象。 - 整体时间修改:
- 基本语法:
modify(日期/时间字符串)
。 - 返回值:修改成功则返回修改后的
DateTime
对象,修改失败则返回false
。
- 基本语法:
- 时区设置:
-
将DateTime对象转为字符串:模板字符串中分别用
Y
、m
、d
来表示年月日,用H
、i
、s
表示时分秒。另外,格式还可以适用DateTime
中的常量进行指定,例如DateTime::RFC1123
,该常量表示符合RFC1123标准的日期时间字符串。- format方法:
DateTime对象名 -> format(模板时间字符串)
- date_format函数:
date_format(DateTime对象名, 模板时间字符串)
- format方法:
-
DateTime对象的计算:
- DateTime对象的加减法:
- 基本功能:给
DateTime
对象增加或减少一定的时间。 - 使用语法:
DateTime对象名 -> add/sub(时间增量/减量)
- 传入参数:接受一个
DateInterval
对象或一个指定时间增量/减量的字符串。 - 返回值:修改后的
DateTime
对象。
- 基本功能:给
- 计算DateTime对象之间的差值:
- 使用语法:
DateTime对象1 -> diff(DateTime对象2)
date_diff(DateTime对象1, DateTime对象2)
- 返回值:返回一个
DateInterval
对象,表示两个日期之间的差值;如果执行失败则返回false
。
- 使用语法:
- DateTime对象的加减法:
PHP的异常处理机制
- 机制介绍:异常处理是一种用于处理程序运行时错误的机制。通过异常处理,开发者可以在程序中捕获和处理错误,而不是让程序崩溃或产生不可预知的行为。异常处理使得代码更具可读性、可维护性,并且能够更好地控制程序的执行流程。
- 几个基本概念:
- 异常:异常是一个对象,表示程序在运行时遇到的错误或异常情况。PHP提供了
Exception
类作为所有异常的基类。开发者可以通过继承该类来创建自定义异常。 - 抛出异常:当程序遇到错误时,可以通过
throw
关键字抛出一个异常对象。抛出异常后,程序的正常执行流程会被中断,控制权会转移到最近的异常处理代码块。 - 捕获异常:通过
try-catch
块,开发者可以捕获并处理抛出的异常。try
块中包含可能抛出异常的代码,而catch
块中包含处理异常的代码。 - 最终执行:
finally
块中的代码无论是否抛出异常都会执行。通常用于清理资源或执行一些必要的操作。
- 异常:异常是一个对象,表示程序在运行时遇到的错误或异常情况。PHP提供了
PHP的数据库操作
- PHP中操作数据库的方式有
MySQLi
和PDO
两种。其中,MySQLi
只能操作MySQL数据库,而PDO
则能操作多种数据库(例如Oracle
等)。
基于MySQLi的数据库操作
- 准备工作:首先要启用PHP的
MySQLi
扩展,启用的方式为:找到PHP安装目录中的配置文件php.ini
,然后将其中的;extension_mysqli
一句的分号去掉即可。 - 老版本的扩展名称:在较早版本的PHP中存在一个名为
MySQL
的扩展,但是现在基本上已经被MySQLi
扩展取代了。 - 两种使用方式:
MySQLi
提供了面向过程和面向对象两种使用方式。- 面向过程的使用语法:
-
创建MySQL数据库连接:
- 基本语法:
连接变量名 = mysqli_connect(数据库服务器地址, 用户名, 密码, 数据库名, 端口号)
- 语法解释:
- 数据库服务器地址:可以是一个域名或者IP地址,使用字符串进行表示。如果是连接本地计算机,则可以直接使用
localhost
或127.0.0.1
。 - 用户名:数据库用户的用户名,使用字符串进行表示。
- 密码:数据库用户对应的密码,使用字符串进行表示。
- 数据库名:可以省略,是指想要连接的数据库的名称。
- 端口号:可以省略,使用一个整数进行表示,如果需要更换数据库的端口号则需要修改。
MySQL
采用的默认端口号是3306
,一般情况下不需要修改数据库服务器的端口号,但是修改了端口号可以让数据库更安全。
- 数据库服务器地址:可以是一个域名或者IP地址,使用字符串进行表示。如果是连接本地计算机,则可以直接使用
- 返回结果: 如果连接成功,则该函数会返回一个连接结果;如果连接不成功,则返回一个布尔值
False
。因此,可以通过检测返回结果来判定数据库连接是否成功。 - 获取错误信息: 如果连接失败,可以通过
mysqli_connect_error()
函数获取错误信息。该函数返回结果是一个字符串。
- 基本语法:
-
执行一条SQL语句:
mysqli_query(连接变量名称, 一条SQL语句字符串)
-
关闭MySQL数据库连接:
- 基本语法:
mysqli_close(需要关闭的数据库连接变量名称)
- 注意事项:一般情况下不关闭数据库连接也没事,因为PHP会自动关闭数据库连接。
- 基本语法:
-
- 面向对象的使用语法:
- 创建MySQL数据库连接:
连接对象名 = new mysqli(数据库服务器地址, 用户名, 密码, 数据库名, 端口号)
。 - 检测连接是否成功:
连接对象名 -> connect_error
,该属性在连接失败时会记录错误信息,连接成功时为False
。 - 执行一条SQL语句:
- 基本语法:
连接对象名 -> query(一条SQL语句的字符串);
。 - 前提条件:为了防止SQL语句中的特殊字符影响执行,需要使用连接对象的的
real_escape_string()
函数对需要执行的SQL语句进行预处理。具体来说,只要将需要执行的SQL字符串作为参数传入该函数即可。
- 基本语法:
- 基于SQL预处理语句的MySQL数据库操作:
- 创建SQL语句模板:编写一条SQL语句,将其中的部分参数的值替换为
?
,表示需要在运行时传入具体的值绑定。例如select * from users where username = ? and password = ?
。 - 创建预处理语句对象:
预处理语句对象名 = 数据库连接对象名 -> prepare(SQL语句模板)
。 - 绑定执行参数:
预处理语句对象名 -> bind_params(参数类型字符串, 参数1, 参数2...)
。- 对于有
n
个参数的SQL语句模板,参数类型字符串中含有按顺序排列的n
个字符,分别表示各个参数的数据类型:i
表示整型,d
表示双精度浮点型,s
表示字符串。
- 对于有
- 执行SQL语句:
预处理语句对象名 -> execute();
。 - 获取执行结果:
预处理语句对象名 -> get_result();
。 - 释放预处理语句:
预处理语句对象名 -> close();
。
- 创建SQL语句模板:编写一条SQL语句,将其中的部分参数的值替换为
- 返回值:
- 对于本身没有返回值的SQL语句,该方法会返回一个布尔值,表示SQL语句是否执行成功,如果执行失败了可以用
连接对象名 -> error
查看错误信息。 - 对于有返回值的SQL语句,会返回一个
mysqli_result
对象,可以使用这个对象来获取查询结果。
- 对于本身没有返回值的SQL语句,该方法会返回一个布尔值,表示SQL语句是否执行成功,如果执行失败了可以用
- 执行多条SQL语句:
- 基本语法:
连接对象名 -> multi_query(多条SQL语句构成的字符串);
。 - 注意事项:该方法可以执行多条SQL语句,但是只执行一条SQL语句也是可以的。另外,多条SQL语句之间记得需要使用英文分号分隔。
- 基本语法:
- 获取SQL查询结果:
- 获取查询结果数量:
结果对象名 -> num_rows
。 - 获取查询结果:
结果对象名 -> fetch_assoc()
:获取结果集中的下一行数据,以关联数组的形式返回该行数据的结果。可以循环执行该语句,来获取结果集中的所有数据行。结果对象名 -> fetch_array()
:获取结果集中的下一行数据,以数值数字的形式返回该行数据的结果。结果对象名 -> fetch_all(resulttype)
:获取结果集中的所有数据,并可以根据传入的参数resulttype
来指定返回结果的方式。resulttype
可取值包括MYSQLI_NUM
、MYSQLI_ASSOC
和MYSQLI_BOTH
,分别表示返回结果是数值数组、关联数组和同时包含的数组。
- 获取查询结果数量:
- 释放SQL查询结果集的资源:
free_result();
。但是一般情况下PHP会自动回收资源。 - 关闭连接:
连接对象名 -> close()
。
- 创建MySQL数据库连接:
- 面向过程的使用语法:
PHP的HTTP函数
-
HTTP响应体的输出:在PHP中,HTTP响应体中的内容实际就是PHP脚本中通过
echo
和print
等输出函数所输出的内容。 -
header
:- 基本功能:让服务器上运行的PHP后端脚本发送一个HTTP响应头到客户端(通常是浏览器)。该函数的主要功能包括发送原始的 HTTP 头部信息、设置HTTP状态码和控制浏览器行为等。
- 发送时间和方式:等当前PHP脚本执行完成后,在HTTP响应体发送之前。所有头部信息在一起发送。
- 简单使用语法:
header(需要发送的HTTP响应头部信息字符串)
。常用的字符串如下:Access-Control-Allow-Origin
:设置允许进行跨域访问本文件的域。Access-Control-Allow-Methods
:设置允许访问该文件的HTTP方法。Access-Control-Allow-Headers
:设置允许的请求头。Access-Control-Allow-Credentials
:设置跨域请求中的Cookie和HTTP认证信息是否可以被发送。
- 使用时的注意事项:
- 使用位置:
header
函数必须在实际输出(如 echo、print、HTML 标签等)之前调用,否则会失败。这意味着header
函数调用通常应该是最先执行的代码之一。 - 可以多次调用:可以多次调用
header
函数来发送多个头部。
- 使用位置:
-
setcookie
:- 基本作用:在服务器端设置HTTP-Cookie,并将其包含在HTTP响应头中发送给客户端(通常是浏览器)。
- 执行时间:当调用该函数时,PHP会在当前的HTTP响应头中添加一个
Set-Cookie
头。这个头会在 HTTP 响应发送给客户端时一并发送。 - 使用语法:
setcookie(name, value, expire, path)
name
:表示该Cookie的名称。value
:表示该Cookie的值。expire
:表示该Cookie的过期时间,如果设置为0
或省略则表示在浏览器关闭时过期。如果设置为time() + 3600
,则表示一小时后过期。path
:表示该Cookie在服务器上可以生效的路径,如果是"/"
则表示整个域名下都有效。
-
parse_url
:- 基本功能:解析一个URL并返回该URL的各个组成部分。
- 适用情况:支持的URL类型包括
http
、ftp
、gopher
和file
等,几乎所有URL都可以使用该函数进行解析。 - 传入的参数:需要进行解析的URL的字符串。
- 返回值:返回一个数组,该数组包含以下键值对:
scheme
:URL的协议部分,例如https
host
:URL的主机名部分,例如www.example.com
port
:URL的端口部分。user
:URL的用户名部分。pass
:URL的密码部分。path
:URL的路径部分,例如index.php
。query
:URL的查询字符串部分,例如key1 = value1&key2 = value2
fragment
:URL的锚点部分,例如section
。
-
htmlspecialchars
:- 基本功能:用于将字符串中的特殊字符转换为
HTML
实体,避免在HTML
文档中引起解析错误或安全漏洞(例如,如果直接使用客户端传来的数据或将其存入数据库,在传来的数据本身是浏览器可以渲染的代码时,可能就会造成数据泄露,即著名的XSS攻击)。 - 转换规则:
- 将
&
转换为&
- 将英文双引号转换为
"
- 将英文单引号转换为
'
- 将
<
转换为<
- 将
>
转换为>
- 将
- 基本功能:用于将字符串中的特殊字符转换为
PHP的其他常用库
PHP中的CURL库
一个最常用的CURL库使用模板如下所示:
<?php
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, "http://example.com/your-endpoint"); // 指定请求的URL
curl_setopt($ch, CURLOPT_POST, true); // 设置为POST请求
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('key1' => 'value1', 'key2' => 'value2'))); // 设置POST的数据
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将响应作为字符串返回而不是直接输出
// 执行cURL会话
$response = curl_exec($ch);
// 检查是否有错误发生
if(curl_errno($ch)) eho 'cURL error: ' . curl_error($ch);
// 关闭cURL会话
curl_close($ch);
// 输出响应内容
echo $response;
?>
- 基本介绍:
cURL
库是PHP的内置库和核心扩展之一,在安装PHP时一般会默认启用。cURL
库是一个功能强大的客户端库,用于在PHP脚本中执行各种类型的HTTP请求来Web服务器进行通信。
- 查看当前PHP环境是否启用了cURL库:执行代码
function_exists('curl_version')
。如果执行完成输出cURL is enabled
,那么可以使用cURL
库进行编程;如果显示cURL is not enabled
,则需要在PHP配置文件中启用cURL扩展。 - 没有启用的解决方法:如果没有启用可以通过修改
php.ini
配置文件,取消被注释的行;extension=curl
即可,取消注释的方法是移除最前面的分号,重启Web服务器之后即可生效。 在小皮面板(phpstudy)中,可以直接通过勾选来启用cURL库。 curl_init()
:- 基本功能:创建一个新的CURL对话。该函数并不发送任何请求,只是为发送请求做好准备。
- 使用语法:
CURL对话变量名 = curl_init()
- 返回值:
- 函数执行成功时返回一个
cURL
句柄(资源类型),使用该句柄可以执行后续的请求。 - 函数如果执行失败,则返回布尔值
false
。
- 函数执行成功时返回一个
curl_setopt()
:- 基本功能:在执行CURL请求之前配置各种参数,如URL、超时时间、HTTP头部、POST数据等。
- 使用语法:
curl_setopt(resource $ch, int $option, mixed $value)
$ch
:由curl_init()
函数返回的CURL句柄。$option
:要设置的CURL选项,是一个预定义的常量,常见的有如下这些:CURLOPT_URL
:设置HTTP请求的URL。CURLOPT_RETURNTRANSFER
:设置是否采用文件流方式。CURLOPT_POST
:设置HTTP请求类型为POST。CURLOPT_POSTFIELDS
:设置HTTP-POST请求的数据。CURLOPT_TIMEOUT
:设置超时时间。
$value
:与选项关联的值。这个值可以是多种类型,具体取决于选项。
curl_exec()
:- 基本功能:执行一个已经初始化并配置了选项的CURL会话。可用来执行各种类型的HTTP请求,如GET、POST、PUT、DELETE等,以及上传或下载数据。
- 使用语法:
curl_exec(resource $ch)
。其中$ch
是由curl_init
函数创建并由curl_setopt
函数设置了选项后的CURL句柄。 - 返回值:
- 执行成功时,该函数返回一个字符串,该字符串包含请求的响应内容。
- 如果该函数执行失败,则返回
false
。
curl_errno()
:- 基本功能:检查在执行CURL请求过程中是否发生了错误,并返回相应的错误代码。如果发生错误,该函数返回一个标准的cURL错误代码,如果没有错误发生,则返回
0
。 - 使用语法:
curl_errno(resource $ch)
,其中$ch
是通过curl_init()
函数创建的句柄。
- 基本功能:检查在执行CURL请求过程中是否发生了错误,并返回相应的错误代码。如果发生错误,该函数返回一个标准的cURL错误代码,如果没有错误发生,则返回
curl_close()
:- 基本功能:关闭之前通过
curl_init()
初始化的CURL会话句柄,并释放与之关联的所有资源。 - 使用语法:
curl_close(resource $ch)
,其中$ch
是通过curl_init()
函数创建的句柄。
- 基本功能:关闭之前通过
附录
附录1【HTTP请求和HTTP响应】
HTTP请求的类型
- 最常用的HTTP请求:
- HTTP请求中最常用的两种请求方式分别是
GET
请求和POST
请求,用于从客户端向服务器发送数据。 - 大部分人工智能大模型的API都是通过向服务器发送这两种请求,由服务器返回结果来进行使用的。
- HTTP请求中最常用的两种请求方式分别是
- GET请求:
- 通过将需要发送给服务器的参数附加在URL上后发送给服务器,这些参数以键值对的形式出现在URL的末尾,使用
?
来将URL和对应的参数分开,不同的参数之间使用&
进行分隔。 - 当服务器端运行着PHP程序时,可以使用
$_GET
超级全局变量获取客户端发来的GET
请求中的参数数据。 GET
请求的参数对任何人都是可见的。GET
请求最多发送2000个字符的数据,因此不适合处理内容非常多的数据发送情况。- 浏览器的收藏夹中可以直接收藏
GET
请求后的网页(也就是带有参数的网页)。
- 通过将需要发送给服务器的参数附加在URL上后发送给服务器,这些参数以键值对的形式出现在URL的末尾,使用
- POST请求:
- 将数据作为请求的主体发送给服务器,而不是作为附加在URL上的参数。
POST
请求的这一特点使得该请求更适合发送敏感数据或超长的内容,例如博客的文本内容等。 - 当服务器端运行着PHP程序时,可以使用
$_POST
超级全局变量获取客户端发来的POST
请求中的数据内容。 POST
请求的内容对除了服务器之外的计算机都是不可见的。POST
请求对发送数据的量没有限制,默认是8MB
,但是可以修改php.ini
文件中的post_max_size
进行修改。
- 将数据作为请求的主体发送给服务器,而不是作为附加在URL上的参数。
备注:在调用大模型的API时,基本上都是使用的POST请求。
- 其他类型的HTTP请求:
HTTP请求方法 | 功能介绍 |
---|---|
PUT | 将数据发送到服务器。与POST 不同,PUT 请求通常用于更新资源。 |
DELETE | 请求服务器删除指定的资源。 |
HEAD | 与GET请求类似,但是服务器不会返回请求资源的主体部分,只返回头部信息。这通常用于检查资源是否存在或其元数据。 |
OPTIONS | 用于描述目标资源的通信选项。可以用来检测服务器支持哪些HTTP方法。 |
PATCH | 用于对资源进行部分更新。与PUT 不同,PATCH 不需要提供完整的资源表示,只需要包含要更改的字段。 |
TRACE | 回显服务器收到的请求,主要用于诊断。 |
CONNECT | 用于建立一个到由目标资源标识的服务器的隧道。通常用于HTTPS通过HTTP代理服务器进行隧道传输。 |
HTTP请求头的概念和使用
-
请求头部的概念:
- 发送方向:HTTP请求的头部由客户端发送给服务器。
- 发送时间:HTTP请求的头部在客户端正式发送HTTP请求主体之前发送,并且发送完成后可以直接发送HTTP请求主体而不需要得到服务器的反馈。
- 包含内容:HTTP请求的头部包含了关于请求本身、客户端环境和期望的响应格式等方面的信息。
- 组成方式:HTTP头部由一系列的键值对组成,每一对键值对都被称为一个“头字段”。
-
常用的请求头部字段:
Host
:指定请求的服务器的域名和端口号,例如Host: www.example.com
User-Agent
:包含了发出请求的用户代理软件信息(通常是浏览器),例如User-Agent: Chrome/58.0.3029.110
Accept
:告诉服务器客户端能够接收的内容类型,如text/html
,application/xhtml+xml
等。Accept-Language
:指出客户端接受的语言,允许用户优先选择语言,例如Accept-Language: en-US,en;q=0.5
Accept-Encoding
:告诉服务器客户端能够处理的编码方式,如gzip, deflate等。Content-Type
:说明了请求正文中数据的MIME类型(MIME的介绍请参加本文附录3)。Authorization
:用于提供认证信息,如认证令牌或凭证。Connection
:控制不同请求/响应之间的网络连接的选项。Cookie
:包含服务器之前通过Set-Cookie头部设置并返回给客户端的cookie
。
HTTP响应头的概念和使用
-
响应头部的概念:
- 发送方向:HTTP响应的头部由服务器发送给客户端。
- 发送时间:在服务器正式发送HTTP响应主体之前发送,发送完成后可以直接发送HTTP响应主体而不需要得到客户端的反馈。
- 包含内容:HTTP响应的头部包含了关于响应本身、服务器环境和如何处理响应内容等方面的信息。
- 组成方式:HTTP头部由一系列的键值对组成,每一对键值对都被称为一个“头字段”。
-
常用的响应头部字段:
Content-Type
:指示响应正文的MIME类型,例如Content-Type: text/html; charset=utf-8
。Content-Length
:指示响应正文的长度,以字节为单位,例如Content-Length: 1234
。Content-Encoding
:指示响应正文使用的编码方式,如gzip
,deflate
等。Content-Language
:指示响应正文使用的语言,例如Content-Language: en-US
。Content-Disposition
:指示一个带有文件名的附件应该如何被处理,通常用于文件下载。Set-Cookie
:服务器用来设置cookie的头部,例如Set-Cookie: name=value; Path=/; HttpOnly
。Location
:用于重定向请求到另一个URL,通常与3xx状态码一起使用,例如Location: https://www.example.com/newpage
。Server
:包含了服务器用来处理请求的软件信息,例如Server: Apache/2.4.1 (Unix)
。Connection
:控制不同请求/响应之间的网络连接的选项,如Connection: keep-alive
或Connection: close
。
附录2【Cookie的基本介绍】
- 定义和作用:Cookie也称为HTTP Cookie或浏览器Cookie,是Web服务器生成并发送至Web浏览器的小型信息文件。这些文件存储在用户的浏览器中,用于在预定义的时间段内或在用户在网站上的会话期间保存信息。浏览器在后续的HTTP请求中将这些Cookie发送回服务器,以帮助网站识别用户并为他们提供个性化的体验。
- 存储位置:Web浏览器将Cookie存储在用户设备上的一个指定文件中。例如,Google Chrome浏览器将所有的Cookie存储在一个名为
Cookies
的文件中。用户可以通过浏览器的开发者工具查看存储的Cookie。 - 主要用途:
- 会话状态管理:例如保持用户的登录状态、购物车内容、游戏分数等。
- 个性化设置:保存用户的自定义设置,如主题和其他偏好。
- 浏览器行为跟踪:用于分析用户行为,例如网站访问模式。
- 创建和管理:服务器在HTTP响应中通过"Set-Cookie"头部向浏览器发送Cookie信息。浏览器在接收到这些信息后,通常会保存下Cookie,并在后续向同一服务器发出的请求中通过"Cookie"头部包含这些信息。服务器可以指定Cookie的过期时间,以及限制其发送的域和路径。
附录3【UUID的基本介绍】
- 基本作用:
UUID
(Universally Unique Identifier,通用唯一识别码)是一种用于信息识别的标准形式。UUID
旨在提供一种唯一的方式来识别信息,无论是在本地系统、网络还是全球范围内。 - 表示方式:
UUID
是一种128
位的数字标识符,通常以32
个十六进制数字表示,并使用连字符分为五组,形式为8-4-4-4-12
。 - 基本原理:
UUID
被设计为在全球范围内具有极高的唯一性。由于UUID
的空间非常大(128
位),理论上可以生成的UUID
数量远远超过宇宙中所有原子的数量,因此实际上可以认为每个生成的UUID
都是唯一的。 - UUID的版本:
UUID
目前有1到5总共五个版本,其中UUID4
是基于随机数或伪随机数的。
附录4【MIME的基本介绍】
- 中文全称:多用途互联网邮件扩展类型。
- 基本功能:最初为了解决电子邮件中附件的格式问题,但是随着互联网的发展,它已经成为了一种用于表示文档、文件或字节流的性质和格式的标准化的方式。
- 应用场景:被广泛应用于HTTP协议、文件上传下载等场景中。
- 结构组成:由类型和子类型两部分组成,两者之间使用
/
分隔。 - 常见的MIME类型:如下表所示。
MIME类型 | 文件类型 |
---|---|
text/plain | 纯文本文件(如 .txt ) |
text/html | HTML文档(如 .html , .htm ) |
text/css | CSS样式表(如 .css ) |
text/javascript | JavaScript代码(如 .js ) |
image/jpeg | JPEG图像(如 .jpg , .jpeg ) |
image/png | PNG图像(如 .png ) |
image/gif | GIF图像(如 .gif ) |
image/svg+xml | SVG矢量图像(如 .svg ) |
audio/mpeg | MP3音频文件(如 .mp3 ) |
audio/wav | WAV音频文件(如 .wav ) |
audio/ogg | Ogg音频文件(如 .ogg ) |
video/mp4 | MP4视频文件(如 .mp4 ) |
video/mpeg | MPEG视频文件(如 .mpeg , .mpg ) |
video/quicktime | QuickTime视频文件(如 .mov ) |
application/pdf | PDF文档(如 .pdf ) |
application/json | JSON数据(如 .json ) |
application/xml | XML文档(如 .xml ) |
application/octet-stream | 二进制数据流(通常用于未知类型的文件) |
multipart/form-data | 用于表单数据上传,通常用于文件上传 |
multipart/mixed | 用于组合多个不同类型的内容 |
附录5【跨域请求】
- 域的概念:一个域通常由三部分组成:协议(比如
HTTP
或HTTPS
)、域名(比如www.example.com
)和端口(比如80
或443
)。 - 跨域请求的概念:一个域上的网页尝试获取另一个域上的资源。
- 浏览器的同源策略:浏览器的一个安全机制,它规定从一个域上加载的脚本尝试向另一个域发起HTTP请求时,浏览器会阻止这个请求。只有当协议、域名和端口都相同时,两个网页才被认为是同源的。因此,如果需要进行跨域请求,则需要进行专门的设置。
- 实现跨域请求的方式:主要有CORS和代理服务器两种方式。
- CORS:全称为跨域资源共享(Cross-Origin Resource Sharing)。这是一个最常用的方法,通过在服务器上设置特定的HTTP头来允许跨域请求。基于这种方式实现跨域请求,相当于向浏览器申请了避免同源策略的特例。
- 代理服务器:前端应用程序不直接向目标服务器发送请求,而是将请求发送到代理服务器;代理服务器接收前端应用程序的请求后可以修改请求头,比如添加必要的认证信息或更改请求的Host头部,然后再将请求发送到目标服务器。由于代理服务器通常与前端应用程序同源,因此这个转发不会受到同源策略的限制。
- CORS的预检机制:对于需要预检的CORS请求,客户端会先发送一个
OPTIONS
请求来获取服务器的许可,然后才发送实际的请求。 - PHP中如何处理跨域请求:
- (1)处理预检请求:当客户端(如浏览器)发起一个跨域
POST
请求之前,通常会先发送一个预检请求(通常是OPTIONS
请求),以确定服务器是否允许该跨域请求。因此,服务器需要监听并响应这个OPTIONS
请求,并通过header()
函数设置适当的CORS头部。 - (2)处理POST请求:在处理
POST
请求时,仍然需要重新发送一个HTTP响应头部给客户端表示允许跨域访问
- (1)处理预检请求:当客户端(如浏览器)发起一个跨域