文章目录
- PHP基本介绍
- 编辑器推荐和本地环境安装
- PHP的最基础语法和输出注释
- PHP中的变量和大小写
- PHP中的用户输入和代码运行方式
- PHP中的数据类型和查看方式
- PHP如何实现网页的动态效果
- PHP中的EOF定界符
- PHP中的常用运算
- PHP中的条件判断语句
- PHP中的循环语句
- PHP中的数组的相关内容
- PHP中的函数
- PHP中的变量作用域
- PHP中的超级全局变量
- PHP中的数组运算和三元运算符
- PHP中的空合并运算符和组合比较运算符
- PHP中判断变量是否为NULL或空
- PHP中字符串相关的函数
- PHP中数组相关的函数
- PHP中时间日期相关的函数
- PHP中的DateTime对象
- PHP中特殊的变量写法和常量
- PHP中的魔术常量
- PHP中的包含文件
- PHP中的类和对象
- PHP中的类的继承
- PHP中的接口
- PHP中的抽象类和抽象方法
- PHP中的trait代码复用
- PHP中的HTTP请求
- PHP中文件的基本操作
- PHP中的MySQL数据库操作
- PHP中的资源类型
- PHP中的cURL库的使用(课外)
- UUID的简单介绍(课外 不仅限于PHP)
- PHP中执行命令行命令(课外)
PHP基本介绍
-
基础概念:
- 名字全称:PHP的全称是“
PHP Hypertext Preprocessor
”,即PHP超文本预处理器。 - 基本功能:PHP是一种用于创建动态的交互性的网站的脚本语言。
- 运行位置:PHP代码运行在服务器端。
- 版本迭代:PHP最新的版本是
PHP8
,但是市面上目前最常用的还是PHP7
。
- 名字全称:PHP的全称是“
-
基本特点:
- 开源免费:PHP是一门开源且免费的编程语言。
- 解释型语言:PHP是一门解释型语言,因此PHP代码执行前无需进行编译,而是直接按照从上往下的顺序,直接运行代码。
- 跨平台:PHP可以支持
Windows
、Linux
、Unix
、MacOS
等操作系统; - 多服务器支持:支持
Apache
、Nginx
、IIS
等类型的服务器。 - 多数据库支持:支持
MySQL
、SQL Server
、Oracle
等数据库。
-
著名的PHP使用案例:全球最大的博客系统
WordPress
的核心和Facebook
的后端都是使用PHP代码进行编写的。 -
PHP文件:
- 包含内容:可以包含文本、
HTML
代码、CSS
代码、JavaScript(JS)
代码和PHP
代码; - 后缀名:PHP文件的后缀名是
.php
。 - 返回结果:代码在服务器上运行,并以纯文本的方式将结果返回给客户端的浏览器。
- 包含内容:可以包含文本、
编辑器推荐和本地环境安装
- 编辑器推荐:
Vscode
、Notepad--
、Notepad next
或Phpstorm
,最后一个不推荐,因为其自动补全功能太强大了,容易让初学者产生依赖。我个人使用的是Vscode
。 - 环境安装:
- 推荐使用
phpstudy
(小皮面板),这样可以避免复杂的环境安装过程。注意尽量不要安装在计算机的C盘,这样可以省去后面很多的麻烦事情。 - 启动服务器软件和数据库:直接在软件的首页即可选择启动指定的服务器软件和数据库管理系统,不过前提是这些服务器软件和数据库管理系统都已经安装完成。
- 软件管理:可以自选安装指定类型和版本的服务器软件、数据库和PHP。
- 网站站点创建:域名随便指定即可,但是不建议使用
.com
和.cn
等常用域名后缀,否则由于域名重合可能影响正常访问网站。第二域名可以不填。另外,还可以指定使用的PHP版本。经过这样的操作,我们就可以创建一个网站站点,并在电脑中的指定路径创建一个与域名相同的网站文件夹。在文件夹中,新建一个网页文件(例如HTML
文件),即可生成一个网页。
- 推荐使用
- PHP推荐调试工具:
xDebug
,该工具可以显著提高PHP编程的效率。具体来说,该工具支持的调试功能包括:断点调试、实时显示各个变量的值等。
Vscode调试PHP代码遇到问题的解决方法:
1.尝试修改不同的PHP版本,因为有时候PHP版本与当前的计算机环境或浏览器版本不兼容导致代码无法运行。修改后如果还不行,就检查是否当前版本的PHP可执行文件的路径在计算机的环境变量中。
2.在phpstudy中设置PHP的到期时间,超过当前的时间(此时显示状态正常,否则显示过期)。
PHP的最基础语法和输出注释
- PHP脚本的开头和结尾:PHP脚本以
<?php
开头,以?>
结尾。 - PHP代码的存放位置:可以放于一个源代码文档中的任何位置,但是文件扩展名一定是
.php
。 - PHP文件中的内容:一般是一些HTML标签和PHP脚本代码,需要注意的是,
HTML
、JS
和CSS
可以写在PHP文件中运行,但是PHP不能写在HTML
、JS
和CSS
文件中运行。
注意:PHP脚本中可以包含HTML代码,但是只包含有PHP代码的脚本文件也可以执行,输出结果将显示在浏览器中。
- PHP代码语句结尾:所有PHP代码语句都以英文分号
;
结尾。 - PHP中的输出:可以通过
echo
或print
两种语言结构来进行输出(注意,是语言结构,并非函数)。- echo介绍:
- 基本功能:用于输出一个或多个字符串。
- 使用语法:
echo expression1, expression2, ...;
- print介绍:
- 基本功能:用于输出一个字符串。
- 与echo的区别:
print
只能输出一个字符串,始终带有一个返回值1
,效率低于echo
。 - 使用语法:
print expression;
- echo介绍:
- PHP中的注释:
- 单行注释:PHP中的单行注释以
//
或#
(用的较少)开头; - 多行注释:PHP中的多行注释是用
/*
和*/
括起来的一部分。
- 单行注释:PHP中的单行注释以
PHP中的变量和大小写
-
PHP中的变量
- 变量的定义语法:
$变量名=初始值
; - 变量中的字符:变量的名称必须以
$
开头,其后的第一个字符只能是字母或下划线,变量中只能包含字符数字字符和下划线。 - 变量的大小写:PHP中的变量名称对大小写敏感,因此不同大小写的变量不是同一个变量。
- 自动确定类型:PHP会自动根据变量的初始值将其转换为正确的数据类型。
- 变量的定义语法:
-
PHP中的名称的大小写
- 不对大小写敏感的名称:PHP中所有的函数名、类名和关键字都不对大小写敏感。
- 对大小写敏感的名称:如上所属,所有的变量名都对大小写敏感。
PHP中的用户输入和代码运行方式
- PHP中的用户输入:
- readline扩展: PHP中可以使用
readline
扩展来获取用户输入的一段文本,其使用语法为变量名 = readline("提示词");
- 内置函数fgets:也可以使用另一个PHP内置函数
fgets
来获取用户输入的一行文本,其使用语法为变量名 = fgets(STDIN);
- readline扩展: PHP中可以使用
- PHP中的代码运行方式
- 命令行运行:将对应版本的PHP的路径添加到计算机的用户变量或系统变量中后,即可在命令行通过
php php源代码文件路径
的方式运行指定的PHP文件中的代码。 - Vscode中运行:在
Vscode
中安装code runner
插件,即可直接在Vscode
中运行PHP代码。
- 命令行运行:将对应版本的PHP的路径添加到计算机的用户变量或系统变量中后,即可在命令行通过
PHP中的数据类型和查看方式
-
PHP中常见的数据类型:字符串、整数、浮点数、布尔类型、数组、对象、
NULL
和资源类型。- 字符串:可以使用单引号或者双引号,但是使用单引号和双引号存在一定区别:
- 单引号字符串:单引号中放入变量名,字符串读取时不会对该变量名进行解析,也就是变量名被作为一个子串放入字符串中。
- 双引号字符串:双引号中放入变量名,字符串读取时会对该变量名进行解析,将其转换为变量的值,再作为子串放入字符串中。
- 整数:和其他语言类似,支持十进制、八进制(前缀是
0
)和十六进制(前缀是0x
),但是正式的编程过程中很少使用其他的进制。 - 浮点数:有小数部分或指数部分的数字,和其他编程语言中的概念相同。
- 布尔类型:即真(
true
)和假(false
)。 - 数组:可以分为一维数组和多维数组。
- 数组定义方式1:
数组名 = array(元素1,元素2,元素3...);
- 数组定义方式2:
数组名 = [元素1, 元素2,元素3...];
- 数组定义方式1:
- 对象:与类与封装有关,与C++中对象的概念一致,此处暂时不介绍。
- NULL:表示变量没有值,可以通过给变量赋值
NULL
来清空该变量的值。 - 资源类型:与数据库和文件等外部引用资源有关,此处暂时不介绍。
- 字符串:可以使用单引号或者双引号,但是使用单引号和双引号存在一定区别:
-
数据类型的查看:开发调试的过程中,可以使用
gettype
函数或var_dump
函数获取一个变量的数据类型。- gettype函数:只是获取一个变量的数据类型,但是不获取值,也不直接输出;
- var_dump函数:直接输出一个变量的数据类型还有值,对于数值和字符串还会输出长度。
PHP如何实现网页的动态效果
- PHP中实现网页动态效果最简单的方式:将HTML界面中各个部分从原先的常量修改为变量,具体实现方式为:在原先填写常量的地方,修改为用PHP中的
echo
语法结构输出变量的语句。
PHP中的EOF定界符
- 功能介绍:
- 基本作用:在 PHP 中,
EOF(End Of File)
是一个定界符,用于定义一个字符串,它可以跨越多行,并且不需要在每行末尾使用引号或连接符。 - 使用场景:这在需要插入大量
HTML
或其他格式化文本时非常有用,因为它可以提高代码的可读性并减少输入错误。
- 基本作用:在 PHP 中,
- 使用语法:
- 基本语法:基本语法如下所示:
- 可以替代:
EOF
三个字符可以使用任意的其他字符串替代,只要保证开头和结尾的字符串完全相同且不在这个跨行字符串中出现即可。例如,可以使用EOT
、EOD
等等字符串替代。 - 结束定界符:结束定界符
EOF
必须单独成行,且前面不能有任何空白或制表符,最后需要加上一个英文分号结尾; - 变量和HTML标签解析:位于这个长字符串中的已经被定义好的PHP变量和包含的HTML标签可以被正常解析(但是函数名称不可以)和进行渲染。需要注意的是,变量名称需要与后面的内容使用空格、换行或HTML标签进行隔开才会生效。
- 引号无需转义:如果跨行字符串中包含单引号或双引号,也无需使用转义表示方法,可以直接输出跨行字符串中的单引号和双引号。
- 可以替代:
- 基本语法:基本语法如下所示:
$string = <<<EOF
这是多行字符串的一部分。
这仍然是在同一个字符串中。
EOF; // 结束 EOF 定界符
PHP中的常用运算
- 算术运算
- 五种常用算术运算:PHP中也可以分别使用
+
、-
、*
、?
、/
和%
来分别表示加法、减法、乘法、除法和取余运算。 - 整数除法运算:PHP中可以使用函数
intdiv
函数来计算两个整数的整除结果,使用语法为intdiv(被除数、除数)
。 - 递增递减运算符:PHP也支持
++
递增运算和--
递减运算,也像其他的编程语言一样支持前置和后置两种方式。
- 五种常用算术运算:PHP中也可以分别使用
- 字符串的连接:可以通过
.
来连接两个运算符,使用语法为字符串1.字符串2
。 - 扩展赋值运算:PHP中也支持类似于其他语言的
+=
、-=
、*=
、/=
、%=
这类扩展赋值运算符,还可以使用.=
来连接两个字符串,实现类似的效果。 - 比较运算:PHP中也支持
==
、<
、>
、<=
、>=
、!=
六种基本的比较运算符,但是还有三种特殊的比较运算符如下:- ===:绝对等于运算符,用于判定两边是否不仅值相等,并且数据类型也相同。
- <>:不相等运算符,作用和
!=
相同。 - !==:不绝对等于运算符,用于判定两边是否不满足绝对等于。
- 逻辑运算:PHP中也支持
&&
、||
、!
与或非三种逻辑运算符(这种方式和其他语言更加贴近,推荐),但是PHP中可以使用and
表示与,or
表示或。另外,PHP中可以使用xor
表示异或,即两者中是否有且只有一个为1
。
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
循环语法完全相同。 - continue和break:PHP中也支持
continue
和break
两种循环控制关键字,分别用于终止一次循环和终止后续的所有循环。 - PHP_EOL常量:常量
PHP_EOL
表示一个换行符,PHP会根据当前的操作系统自动选择换行符。该常量常与字符串进行连接,用于将字符串分为多行输出。
PHP中的数组的相关内容
- 数组的本质:PHP中的数组实际上是字典,而非类似于C++语言中的数组。也就是说,PHP数组的索引可以为任何类型(例如字符串类型),并且键可以逻辑上不连续。PHP中对于连续整数作为索引的数组,称为索引数组;对于其他类型作为索引的数组,称为关联数组(相当于Python中的字典)。
- 数组的默认索引:PHP数组中的元素可以不设置索引,而直接设置一个值,此时PHP就会对那些没有设置索引的元素从
0
开始按顺序分配索引。 - 获取数组中的元素个数:可以使用
count(数组名)
来获取数组中的元素个数。 - 数组的遍历方式:
- 基于for循环的数组遍历:由于可以使用
count
函数来获取数组中的元素个数,因此对于索引为连续整数的数组,可以使用for
循环进行遍历。 - 基于foreach循环的数组遍历:
- 如果只想要数组元素的值,则可以使用语句
foreach(数组变量名 as 数组元素变量名)
来进行遍历。 - 如果不仅需要数组元素的值,还需要每个元素对应的键,则可以使用语句
foreach(数组变量名 as 键名 => 值名)
来进行遍历。
- 如果只想要数组元素的值,则可以使用语句
- 基于for循环的数组遍历:由于可以使用
- 多维数组:PHP也支持多维数组,多维数组中的元素不一定要是相同的数据类型(有点像Python中的列表)。多维数组的遍历也是基于嵌套的
for
循环或foreach
循环即可。 - 数组的输出:可以使用
print_r
函数格式化输出数组中的内容。使用该函数进行输出,可以得到简洁便于阅读的格式。
PHP中的函数
PHP中的函数也可以分为内置函数和自定义函数两大类。
- 内置函数:常见的PHP内置函数除了之前提到过的
count
函数、print_r
函数等,还有获取当时间戳的time
函数,和根据指定的字符串模板格式获取时间的date
函数等等。 - 自定义函数:
- 函数命名:函数的名称要以字母或下划线进行开头。
- 函数的定义:函数定义的语法如下代码部分所示,调用时直接根据函数名称进行调用即可。如果需要传递参数,则在函数定义的过程中需要在括号中添加参数列表,只是和C++函数定义相比无需指定参数的数据类型。
- 指定参数类型:尽管PHP的函数参数列表中无需指定参数的类型,但是在有需要的情况下,仍然可以强行指定,语法和C++中的函数相同。例如,想要指定传入的参数类型只能是整型
int
,则传参列表中在参数名前加上int
关键词即可。这种方式称为严格模式,使用前需要在函数定义的上一行增加一条代码:declare(strict_types = 1);
- 函数的返回值:函数的返回值仍然和C++语言一样,通过
return
关键字进行传回。
function 函数名()
{
函数体;
}
PHP中的变量作用域
PHP中的变量作用域也可以粗分为全局作用域和局部作用域两种,另外还有static
作用域。
- 全局作用域:
- 在所有函数外部定义的变量都具有全局作用域,可以被脚本中的任何位置访问
- 如果在函数中需要访问一个全局变量,则必须在该函数中使用
global
关键字声明该变量。
- 局部作用域:函数内部声明的变量都是局部变量,只有在函数内部才能访问。
- static作用域:在函数内部声明变量时使用
static
进行修饰,则该变量变为static
变量。每一次调用该变量所在的函数,该变量存储的仍然是上一次该函数执行结束时该变量的值。 - unset函数:
unset()
是PHP中的一个内置函数,用于删除某个指定的变量,该变量的变量名作为参数传递给unset
函数。另外,unset
函数还可以用于删除数组中的某个指定元素和类的某个属性。 - isset函数:该函数用于判定某个名称的变量是否存在且值不为
NULL
,使用语法与unset
函数类似。
PHP中的超级全局变量
- 基本作用:PHP中的超级全局变量可以在项目的任意一个源代码文件中被使用。
- $GLOBALS: 一个重要的超级全局变量,包含了所有变量的全局组合数组,变量的名称就是数组的键。
- $_SERVER:另一个重要的超级全局变量,包含了头信息(header)、路径和脚本位置等信息的数组,由项目中的Web服务器负责创建。另外,不同的服务器提供的该超级全局变量的内容是不同的。该数组里面有一些重要的参数,可能需要记忆。
PHP中的数组运算和三元运算符
- 数组运算:
- 数组的合并:
- +运算符合并: 数组的合并可以通过运算符
+
来完成, 这种方式只会保留第一个数组中的键值对,而忽略后面的数组中具有相同的键的元素, - array_merge函数合并:可以使用
array_merge
函数来合并数组。和使用+运算符不同,使用该方式时,如果遇到几个数组具有相同的键,则只会把最后一个数组中该键对应的值保留,而删除之前的。使用语法为array_merge(数组1,数组2...);
。
- +运算符合并: 数组的合并可以通过运算符
- 数组的判等:数组的判等也分为
==
和===
两种。前面一种只会判定两个数组的值是否对应相同;后面一种会判定两个数组中的键值对是否完全一致,且顺序和数据类型都相同。
- 数组的合并:
- 三元运算符:三元运算符
?:
和C++
中的三元运算符语法完全相同。
PHP中的空合并运算符和组合比较运算符
- 空合并运算符:
- 基本作用:简化处理可能为
NULL
的变量或数组元素。判定一个变量是否未定义或值为NULL
,如果是的话则返回一个默认值,否则直接返回该变量的值。 - 使用语法:
变量名 ?? 默认值
。
- 基本作用:简化处理可能为
- 组合比较运算符:
- 基本作用:比较两个整数、浮点数或字符串的大小。
- 使用语法:
a <=> b
。如果a < b
则返回-1
,如果a = b
则返回0
,如果a > b
则返回1
。
PHP中判断变量是否为NULL或空
- is_null函数:可以用于判定某个变量是否为
NULL
。 - empty函数:用于检查一个变量是否为空(包括数值是否为
0
,长度为0
的字符串,以及NULL
等等)。
PHP中字符串相关的函数
- 长度获取:
- strlen():用于获取一个字符串的长度,需要注意的是PHP中一个汉字的长度为
3
。
- strlen():用于获取一个字符串的长度,需要注意的是PHP中一个汉字的长度为
- 子串查找:
- strpos():在一个字符串内查找某个字符或某个字符串的首字符位置,返回值是第一次出现的位置或
false
(表示字符串中不存在查找内容)。 使用语法为strpos(字符串, 待查找的字符或子串)
。 - stripos():功能和
strpos
相同,但是不区分英文字符的大小写。 - strrpos():功能和
strpos
类似,但是是返回最后一次出现的位置,类似的还有与stripos
函数对应的stripos()
函数。
- 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中数组相关的函数
- array():可以使用
array()
函数创建一个数组; - count():可以返回一个数组中的元素的数量,使用语法为:
count(数组名)
。 - array_push():可以将一个或多个元素添加到数组的末尾,使用语法为:
array_push(数组名, 新元素)
。 - array_unshift():可以将一个或多个元素添加到数组的开头,使用语法和
array_push
函数类似。 - array_pop():删除并返回数组中的最后一个元素,只返回值不返回键。
- array_shift():删除并返回数组中的第一个元素,同样只返回值不返回键。
- array_slice():从数组中提取部分元素构成一个新的数组,使用语法为:
array_slice(数组名, 开始提取元素的位置, 提取元素的个数)
,其中提取元素的个数可以不填,默认取从开始位置后的所有元素。另外,针对数值数组,该函数还可以有第四个参数,这个参数是一个布尔值:如果为true
则表示新生成的数组保留原数组的键名称,如果为false
则表示使用从0开始默认生成的新的键。 - array_merge():合并两个或多个数组,在之前有进行过学习。
- array_reverse():颠倒当前数组中的所有元素的顺序。
- in_array():检查当前数组中是否存在某个指定值的元素。使用语法为:
in_array(待查找的元素, 数组名)
,返回值是一个布尔值。 - array_key_exists():检查数组中是否存在指定的键。使用语法为:
array_key_exists(待查找的元素, 数组名)
,返回值也是一个布尔值。 - array_keys():
- 返回数组中的所有键构成的一个新的数组,使用语法为:
array_keys(数组名)
。 - 还有一种扩展用法是查找一个数组中指定值的所有键,使用语法为:
array_keys(数组名, 指定的值)
。 - 上一种扩展用法还可以继续进行扩展,传入第三个参数,该参数是一个布尔值,表示查找时是否采用严格模式(值相等且数据类型相同),默认为
false
。
- 返回数组中的所有键构成的一个新的数组,使用语法为:
- array_values():返回数组中的所有值构成的一个新的数组。
- array_search():在数组中搜索指定的值,并返回该值对应的键。如果有多个结果满足条件,则只返回第一个结果。
- array_unique():移除数组中的所有重复值。
- max/min():求数组中的最大值或最小值,传入的参数是数组名。
- sort():对数组元素进行升序排序。该函数完成排序后返回一个布尔值
true
。 - rsort():对数组元素进行降序排序。该函数的返回值也是
true
。 - array_sum():对数组元素进行求和。
- array_product():对数组元素进行求积。
PHP数组的负索引:从PHP 7.4.7开始,PHP中的数组开始支持负数索引,其使用规则和Python语言的负数索引相同。
PHP中时间日期相关的函数
- time():获取当前的时间戳,在PHP中的时间戳是一个十位的整数。
- microtime(true):获取当前的浮点数时间戳,该时间戳精确到微秒,而
time
函数只精确到秒。 - date():用于将时间戳转换为时间对象。该函数的用法为:
date(模板字符串, 时间戳)
,模板字符串中用Y
、m
和d
分别表示年月日,H
(h
)、i
、s
分别表示时分秒。用H
表示二十四小时制的时,而h
表示的是十二小时制的时。 - strtotime():
- 该函数可以将一个表示时间的字符串(例如"
2024-08-09
"转换为时间类型的数据)。 - 该函数可以计算下一个周几的日期,并返回一个字符串,传入的第一个参数是一个字符串,为"
next 周几
"(例如next Monday
),第二个参数是一个时间类型,表示某个日期。 - 该函数可以计算当前日期后的第
x
天的日期,此时传入两个参数,第一个参数为"+x day
",第二个参数是一个时间类型,表示具体日期。
- 该函数可以将一个表示时间的字符串(例如"
- mktime():该函数可以用于生成时间戳,使用语法为:
mktime(小时, 分钟, 秒, 月, 日, 年)
。 - date_create():该函数可以创建一个日期时间对象,使用语法为:
date_create(时间字符串)
,这里的时间字符串的表示格式为xxxx-xx-xx xx:xx:xx
。 - date_format():用于将日期时间对象格式化为指定模板的字符串,使用语法为:
date_format(时间对象, 模板字符串)
,模板字符串中仍然分别用Y
、m
、d
来表示年月日,用H
、i
、s
表示时分秒。 - date_diff():用于计算两个日期之间的差值,使用语法为:
date_diff(日期对象1, 日期对象2)
,需要注意的该函数计算的是日期对象2减去日期对象1的差值。该函数的返回值是一个对象,对象中的属性y
、m
、d
分别表示年月日差值,h
、i
、s
分别表示时分秒差值。 - strftime():该函数可以根据指定的格式,将时间戳格式化为可读的日期时间字符串。使用语法为:
strftime(模板字符串, 时间戳)
。模板字符串中,用%A
表示星期几,分别用%Y
、%m
和%d
表示年月日,用%H
、%M
和%S
表示时分秒。需要注意的是,该函数在PHP8中被废弃。
PHP中的DateTime对象
- 创建对象的方法:
对象变量名 = new DateTime(时间日期字符串)
,其中的时间日期字符串的格式是xxxx-xx-xx xx:xx:xx
。 - 修改DateTime对象的时间:
- 第一种方法:可以通过调用该对象的
modify
方法修改对象的时间,例如,可以通过DateTime对象名 -> modify("+x day")
和DateTime对象名 -> modify("-x hour")
来修改当前对象的日期和时间。 - 第二种方法:可以首先创建一个
DateInterval
时间间隔对象,然后通过DateTime
对象的add
方法添加时间间隔。例如,可以使用DateTime对象名 -> add(new DateInterval("P1D"))
来把当前的日期增加一天。类似的,可以使用该对象的sub
方法来减去一个时间间隔。
- 第一种方法:可以通过调用该对象的
- 将DateTime对象格式化为指定模板的时间字符串:可以通过调用该对象的
format
方法来获得该对象的指定格式的时间字符串。例如,DateTime对象名 -> format("Y-m-d H:i:s")
。 - 设置DateTime对象的日期和时间:可以使用
DateTime
对象的setDate
方法来指定该对象的具体日期,需要分别传入年月日三个参数。例如,对象名称 -> setDate(2024, 8, 14);
。类似的,还可以通过setTime
方法来设置该对象的具体时间。 - 设置和获取时区:可以使用该对象的
setTimezone
方法来设置时区,传入的参数是一个DateTimeZone
对象,具体使用方法略。另外,还可以通过该对象的getTimezone
方法来获取该对象的时区,获取时区后,对该时区对象分别使用getName
方法和getLocation
方法即可获取该时区的地点名称和地址信息。 - 获取时间戳:可以通过该对象的
getTimestamp
方法获取该对象的时间戳。 - 计算两个DateTime对象的时间差:可以通过一个对象的
diff
方法计算两个对象的时间差,传入该方法的参数即为另一个DateTime
对象。需要注意的是,作为参数的DateTime
对象才是被减的。
PHP中特殊的变量写法和常量
- 特殊的变量写法
- PHP中有些变量的定义前面可以包含两个或多个
$
符号,例如下面这样。 - 此时,
$$a
实际上就是$($a)
,会被解析为$b
。
- PHP中有些变量的定义前面可以包含两个或多个
$a = "b"; // 定义变量$a,并赋予它字符串值"b"
$$a = 1; // 这相当于定义了变量$b,并将其值设置为1
echo $b; // 这会输出1
- PHP中的常量
- 基本概念:常量是指定义之后在脚本的任何地方都不可以被改变的量。
- 命名规则:与PHP中的变量类似,也需要严格区分大小写,但是无需
$
符号。推荐对常量名进行大写,与变量名进行更好区分。 - 定义方式:
- 使用define关键字进行定义:
define(常量名, 常量值)
,其中的常量名用字符串进行表示。 - 使用const关键字进行定义:
const 常量名 = 常量值
。相较于define
关键字的定义方式,这种方式可以用于类常量成员的定义,而define
不能。
- 使用define关键字进行定义:
- 注意事项:常量默认是全局可用的。
- constant函数:用于获取指定常量的值,传入的参数即常量名。
- 获取所有定义过的常量:可以使用
get_define_constants
函数获取所有用户定义过的常量,使用语法为get_define_constants(true)["user"]
。
PHP中的魔术常量
- 魔术常量的概念:其值会随着其在代码中的位置的改变而改变。
- 八个常用的魔术常量:
- 源代码文件的当前行号:
__LINE__
; - 文件的完整路径和文件名:
__FILE__
; - 文件所在的目录:
__DIR__
; - 当前正在执行的最内层函数的名字:
__FUNCTION__
; - 当前代码所处于的类的名字:
__CLASS__
; - 当前的命名空间:
__NAMESPACE__
; - 当前的命名空间、类名和函数名:
__METHOD__
; - 当前使用的trait方法的名称:
__TRAIT__
;
- 源代码文件的当前行号:
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中的类和对象
- 类的定义方式:使用
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中类的静态方法:
- 定义语法:在类函数的访问权限控制符和
function
关键字之间加入一个static
关键字即可。例如public static function sayHello()
。 - 调用语法:使用
类名 :: 静态函数名
的方式进行调用。 - 与普通成员方法的区别:类的静态方法只能调用类的静态属性,而不能调用普通的成员属性。
- 定义语法:在类函数的访问权限控制符和
PHP中的类的继承
- 基本语法:
class 子类名 extends 父类名
。 - 注意事项:
- 属性继承:子类会继承父类的所有属性,包括私有属性,虽然私有属性只有在父类内部才能访问。
- 方法覆盖:子类中会继承父类中的所有非私有方法,但是子类中如果定义与父类同名的方法,将会执行子类中的方法,这种情况被称为方法覆盖。另外需要说明的是,PHP中不允许有相同名字的方法,因此不存在类似于C++中的方法重载的概念。
- 构造函数:如果子类没有专门定义构造函数,将会隐式调用父类的无参构造函数。
- 不可被覆盖的方法:如果将父类中的一个方法声明为
final
,则该方法无法被子类中的方法覆盖。但是,final
关键字不能用于修饰类的属性。 - 只支持单继承:PHP中不支持多继承,即一个类只能继承一个类。
- 调用父类的成员:如果父类的成员被子类覆盖,但是想要调用父类的成员,则可以使用
parent::
父类成员名来进行调用。
- 静态延迟绑定:
- 之前学习静态方法时,我们知道在类的成员函数可以通过
self::静态方法名
的方式调用静态方法。 - 在使用继承的情况下,这种方式实际上是由定义该静态方法的类来调用该静态方法,有时候我们不希望这样做,而是想要调用该方法的类直接执行该静态方法,则可以使用
static::静态方法名
的方式。 - 也就是说,
self::
和static::
的区别就是调用调用静态方法的类的。这种语法实际的使用情况很少。
- 之前学习静态方法时,我们知道在类的成员函数可以通过
- 获取函数传入的参数个数:
- PHP中传给一个函数的参数可以与该函数参数列表中的参数个数或类型不匹配。
- 当传入的参数个数比参数列表中的参数个数要多,PHP会自动忽略多出来的参数;当传入的参数个数比参数列表中的参数个数要少,则PHP会自动将没有传入的参数赋值为
NULL
。 - 当传入的参数和参数列表中的参数类型不匹配,则PHP会自动进行类型转换。
- 当传入的参数个数比参数列表中的参数个数要多,PHP会自动忽略多出来的参数;当传入的参数个数比参数列表中的参数个数要少,则PHP会自动将没有传入的参数赋值为
- 可以使用在一个函数定义中使用
func_get_args()
函数获取传入该函数的所有参数(以数组的形式),还可以使用func_num_args()
函数获取传入该函数的参数个数。
- PHP中传给一个函数的参数可以与该函数参数列表中的参数个数或类型不匹配。
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中的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请求。
- 超级全局变量
$_REQUEST
和$_SERVER
:$_REQUEST
:其本质是一个数组,该超级全局变量中包含了$_GET
、$_POST
和$_COOKIE
等其他超级全局变量中的内容(可以暂时不去详细了解COOKIE
是什么东西)。$_SERVER
:该超级全局变量可以用于获取客户端向服务器发送的请求方式(例如是POST
请求还是GET
请求)。
- Cookie的概念:Cookie是一种网络数据存储机制,它允许网站在用户的浏览器中保存小块数据,并在后续的HTTP请求中将其发送回服务器,以维持用户会话状态和实现用户识别功能。
- htmlspecialchars函数:用于将字符串中的特殊字符转换为
HTML
实体,避免在HTML
文档中引起解析错误或安全漏洞(例如,如果直接使用客户端传来的数据或将其存入数据库,在传来的数据本身是浏览器可以渲染的代码时,可能就会造成数据泄露,即著名的XSS攻击)。转换规则如下:- 将
&
转换为&
; - 将英文双引号转换为
"
; - 将英文单引号转换为
'
; - 将
<
转换为<
; - 将
>
转换为>
。
- 将
PHP中文件的基本操作
- 打开文件:
文件变量名 = fopen(文件路径, 打开方式)
。这里的打开方式例如以只读方式打开文件,用"r
"进行表示。 - 关闭文件:
fclose(文件变量名)
。
PHP中的MySQL数据库操作
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()
函数获取错误信息,该函数返回结果是一个字符串。 - 提前终止程序:在PHP中,可以通过
die
函数来终止当前脚本的运行并输出提示信息。该函数的使用语法是die(终止程序时给出的提示信息)
。 - 异常处理方法:PHP中也支持异常处理,使用的语法为
try {...} catch (Exception 异常变量名) {...}
。对于异常变量,可以通过该对象的getMessage()
方法来获取异常内容。
- 获取错误信息: 如果连接失败,可以通过
- 基本语法:
- 执行一条SQL语句:
mysqli_query(连接变量名称, 一条SQL语句字符串);
。 - 关闭MySQL数据库连接:
- 基本语法:
mysqli_close(需要关闭的数据库连接变量名称)
。 - 注意事项:一般情况下不关闭数据库连接也没事,因为PHP会自动关闭数据库连接。
- 基本语法:
- 创建MySQL数据库连接:
- 面向对象的使用语法:
- 创建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中的资源类型
- 基本概念:资源类型是一种特殊类型的变量,保存了外部资源的一个引用。在连接数据库、打开一个文件时,返回结果就是一个资源类型。
- 判定语法:
is_resource(对象名)
。该方法只能适用于较老版本的PHP。 - 获取资源的类型:
get_resource_type(资源对象名)
。该方法也只能适用于较老版本的PHP。
PHP中的cURL库的使用(课外)
- 基本介绍:cURL库是PHP的内置库和核心扩展之一,在安装PHP时一般会默认启用。该库是一个功能强大的客户端库,用于在PHP脚本中执行各种类型的HTTP请求,以与Web服务器进行通信。
-
查看当前PHP环境是否启用了cURL:可以执行如下的代码。如果执行完成输出
cURL is enabled
,那么可以使用cURL
库进行编程。如果显示cURL is not enabled
,则需要启用cURL扩展。 -
没有启用的解决方法:如果没有启用可以通过修改
php.ini
配置文件,取消被注释的行;extension=curl
即可,取消注释的方法是移除最前面的分号,重启Web服务器之后即可生效。 在小皮面板(phpstudy)中,可以直接通过勾选来启用cURL库。
-
<?php
if (function_exists('curl_version')) {
echo "cURL is enabled";
} else {
echo "cURL is not enabled";
}
?>
- 使用语法:一个通用的简单示例如下所示:
<?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_init()函数:
- 基本功能:在PHP中,可以使用
curl_init()
函数来创建一个新的cURL对话。该函数并不发送任何请求,只是为发送请求做好准备。 - 使用语法:
变量名 = curl_init();
。 - 返回值:该函数返回一个
cURL
句柄(PHP资源类型),使用该句柄可以执行后续的请求。 如果创建失败,则返回布尔值false
。
- 基本功能:在PHP中,可以使用
- curl_setopt()函数:
- 基本功能:用于设置cURL的会话选项。通过这个函数,可以在执行cURL请求之前配置各种参数,如URL、超时时间、HTTP头部、POST数据等。
- 使用语法:
curl_setopt(resource $ch, int $option, mixed $value)
$ch
:由curl_init()
函数返回的cURL句柄。$option
:要设置的cURL选项,它是一个预定义的常量,如CURLOPT_URL
(设置请求的URL)、CURLOPT_RETURNTRANSFER
(是否采用文件流)、CURLOPT_POST
(HTTP请求类型)、CURLOPT_POSTFIELDS
(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_close()函数:
- 基本功能:关闭之前通过
curl_init()
初始化的cURL会话句柄,释放与之关联的所有资源。 - 使用语法:
curl_close(resource $ch)
,其中$ch
是通过curl_init()函数创建的句柄。
- 基本功能:关闭之前通过
UUID的简单介绍(课外 不仅限于PHP)
- 基本作用:
UUID
(Universally Unique Identifier,通用唯一识别码)是一种用于信息识别的标准形式。UUID
旨在提供一种唯一的方式来识别信息,无论是在本地系统、网络还是全球范围内。 - 表示方式:
UUID
是一种128
位的数字标识符,通常以32
个十六进制数字表示,并使用连字符分为五组,形式为8-4-4-4-12
。 - 基本原理:
UUID
被设计为在全球范围内具有极高的唯一性。由于UUID
的空间非常大(128
位),理论上可以生成的UUID
数量远远超过宇宙中所有原子的数量,因此实际上可以认为每个生成的UUID
都是唯一的。 - UUID的版本:
UUID
目前有1到5总共五个版本,其中UUID4
是基于随机数或伪随机数的。
PHP中执行命令行命令(课外)
- shell_exec()函数:
- 基本功能:该函数可以执行Windows命令行的命令语句,并返回输出结果中最后一行的内容。
- 使用语法:
shell_exec(需要执行的命令字符串)
。 - 返回值:执行成功时,返回命令行输出结果中的最后一行;执行失败时,返回
NULL
;如果命令行执行本身没有输出,则返回一个空字符串。
- escapeshellarg()函数:
- 基本功能:该函数可以将一个字符串转换为可以安全传递给Shell命令行的形式。它确保字符串中的特殊字符(如空格、引号、重定向符号等)被正确地转义,以避免shell解释它们。
- 使用语法:
escapeshellarg(需要转换的字符串)
。 - 返回值:完成安全转义之后的字符串。