PHP语法基础
PHP (Hypertext Preprocessor)是一种创建动态交互性站点的强有力的服务器端脚本语言。PHP 是免费的,并且使用非常广泛。同时,对于像微软 ASP 这样的竞争者来说,PHP 无疑是另一种高效率的选项。
1. PHP基本语法
基本格式
PHP脚本以<?php
开始,以?>
结束。PHP代码通常嵌入在HTML中运行。
PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
通过 PHP,有两种在浏览器输出文本的基础指令:echo 和 print。
1 | <!DOCTYPE html> |
在 PHP 中有两个基本的输出方式: echo 和 print
echo 和 print 区别:
- echo - 可以输出一个或多个字符串
- print - 只允许输出一个字符串,返回值总为 1
提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。
echo 是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo()
显示字符串
下面的实例演示了如何使用 echo 命令输出字符串(字符串可以包含 HTML 标签):
1 |
|
1 | //显示变量 下面的实例演示了如何使用 echo 命令输出变量和字符串 |
print 同样是一个语言结构,可以使用括号,也可以不使用括号: print 或 print()
1 |
|
1 |
|
echo,print,print_r,var_dump 的区别
1.echo
输出一个或者多个字符串。
2.print
和 echo 最主要的区别: print 仅支持一个参数,并总是返回 1。
3.print_r
打印关于变量的易于理解的信息,如果给出的是 string、integer 或 float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。 记住,print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。
4.var_dump
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
5.var_dump 和 print_r 的区别
var_dump 返回表达式的类型与值而 print_r 仅返回结果,相比调试代码使用 var_dump 更便于阅读。
EOF
PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。
使用概述:
- 必须后接分号,否则编译通不过。
- EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
- 3. 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
- 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
1 |
|
<<<EOF 开始标记开始,以 EOF 结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。
变量
变量可以是很短的名称(如 x 和 y)或者更具描述性的名称(如 age、carname、totalvolume)。
PHP 变量规则:
- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
1 |
|
PHP 没有声明变量的命令。
变量在您第一次赋值给它的时候被创建
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问
1 |
|
PHP 变量作用域
变量的作用域是脚本中变量可被引用/使用的部分。
PHP 有四种不同的变量作用域:
- local
- global
- static
- parameter
global 关键字用于函数内访问全局变量。
在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字:
1 | $x=5; $y=10; |
PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
1 |
|
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。
要做到这一点,请在您第一次声明变量时使用 static 关键字:
1 |
|
1 | 0 |
没有使用static
1 |
|
1 | 0 |
然后,每次调用该函数时,该变量将会保留着函数前一次被调用时的值。
注释:该变量仍然是函数的局部变量。
参数作用域
参数是通过调用代码将值传递给函数的局部变量。
参数是在参数列表中声明的,作为函数声明的一部分
数据类型
PHP 变量存储不同的类型的数据,不同的数据类型可以做不一样的事情。
PHP 支持以下几种数据类型:
- String(字符串)
- Integer(整型)整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。
- Float(浮点型)
- Boolean(布尔型)
- Array(数组)
- Object(对象)
- NULL(空值)
- Resource(资源类型)
1 |
|
1 |
|
PHP NULL 值
NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。
NULL 值指明一个变量是否为空值。 同样可用于数据空值和NULL值的区别。
可以通过设置变量值为 NULL 来清空变量数据
1 |
|
PHP 资源类型
PHP 资源 resource 是一种特殊变量,保存了到外部资源的一个引用。
常见资源数据类型有打开文件、数据库连接、图形画布区域等。
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。
使用 get_resource_type() 函数可以返回资源(resource)类型
1 |
|
- 松散比较:使用两个等号 == 比较,只比较值,不比较类型。
- 严格比较:用三个等号 === 比较,除了比较值,也比较类型。
PHP 中的常量是指一旦定义后其值不能被改变的标识符。
常量值被定义后,在脚本的其他任何地方都不能被改变。
常量可以用 define() 函数或 const 关键字来定义。
常量的特性
PHP 常量
- 不变性: 常量一旦定义,其值不能改变。
- 全局作用域: 常量在定义后,可以在整个脚本的任何地方使用,无需使用
global
关键字。 - 数据类型: 常量的值可以是标量数据类型(如布尔值、整数、浮点数、字符串)或数组(PHP 7 及以上版本)。
- 区分大小写: 常量名称默认是区分大小写的。如果需要定义大小写不敏感的常量,可以在
define()
函数的第三个参数设置为true
。
常量是一个简单值的标识符,该值在脚本中不能改变。
一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。
注意: 常量在整个脚本中都可以使用。
设置 PHP 常量
设置常量,使用 define() 函数,函数语法如下:
1 | bool define ( string $name , mixed $value [, bool $case_insensitive = false ] ) |
该函数有三个参数:
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感,默认是大小写敏感的。
注意:自 PHP 7.3.0 开始,定义不区分大小写的常量已被弃用。从 PHP 8.0.0 开始,只有 false 是可接受的值,传递 true 将产生一个警告。
使用 const 关键字
1 | const CONSTANT_NAME = "value"; |
用常量时,不能在常量名前添加**$** 符号,不然会将常量转换成新的未定义变量使用,会导致报错。
预定义常量
PHP 提供了一些预定义常量,可以在脚本中直接使用。这些常量通常用于获取 PHP 的配置信息、版本信息等。常见的预定义常量有:
PHP_VERSION
:当前 PHP 解析器的版本。PHP_OS
:服务器的操作系统。PHP_INT_MAX
:最大的整数值。E_ERROR
、E_WARNING
、E_PARSE
等:错误报告级别。
PHP 并置运算符
在 PHP 中,只有一个字符串运算符。
并置运算符 (.) 用于把两个字符串值连接起来。
下面的实例演示了如何将两个字符串变量连接在一起:
1 |
|
上面的代码将输出:Hello world! What a nice day!
提示:在上面的代码中,我们已经使用了两次并置运算符。这是由于我们需要在两个字符串之间插入一个空格。
PHP strlen() 函数
有时知道字符串值的长度是很有用的。
strlen() 函数返回字符串的长度(字节数)。
下面的实例返回字符串 “Hello world!” 的长度:
1 |
|
上面的代码将输出:12
提示:strlen() 常常用在循环和其他函数中,因为那时确定字符串何时结束是很重要的。(例如,在循环中,我们需要在字符串中的最后一个字符之后结束循环。)
PHP strpos() 函数
strpos() 函数用于在字符串内查找一个字符或一段指定的文本。
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。
下面的实例在字符串 “Hello world!” 中查找文本 “world”:
1 |
|
上面的代码将输出:6
提示:在上面的实例中,字符串 “world” 的位置是 6。之所以是 6 而不是 7 的原因是,字符串中第一个字符的位置是 0,而不是 1
运算符:
PHP 运算符主要分为以下几类:
算术运算符:用于执行基本的数学运算。
+
加法-
减法*
乘法/
除法%
取模(余数)**
或pow()
幂运算
赋值运算符:用于给变量分配值。
=
简单赋值+=
加并赋值-=
减并赋值*=
,/=
,%=
,.=
,**=
等等
比较运算符:用于比较两个值。
==
等于(值比较,不考虑类型)===
全等(值和类型都相等)!=
不等于(值比较,不考虑类型)!==
不全等(值或类型不相等)<
小于>
大于<=
小于等于>=
大于等于
逻辑运算符:用于进行逻辑判断。
&&
逻辑与||
逻辑或!
逻辑非and
,or
,xor
PHP 也支持这些作为逻辑运算符的同义词
三元运算符:条件表达式,是 if…else… 的简写形式。
条件 ? 表达式1 : 表达式2
字符串运算符:
.
字符串连接.=
字符串连接赋值
成员访问运算符:用于访问对象的属性和方法。
->
对象中的属性或方法访问::
静态成员访问,也可用于命名空间中的常量访问
数组运算符:
==
和===
也可以用于比较数组+
数组合并(但不常用,推荐使用array_merge()
)
**空合并运算符 (??)**:从 PHP 7 开始引入,用于在变量为 NULL 或未设置时提供默认值。
expr1 ?? expr2
如果expr1
存在且不为 NULL,则返回expr1
,否则返回expr2
了解并熟练运用这些运算符对于编写高效的 PHP 代码至关重要。
数组
数组是一个变量,可以在一个变量名中存储多个值。
1 |
|
1 |
|
获取数组的长度 - count() 函数
count() 函数用于返回数组的长度(元素的数量):
1 |
|
遍历数值数组
遍历并打印数值数组中的所有值,您可以使用 for 循环,如下所示:
1 |
|
PHP 关联数组
关联数组是使用您分配给数组的指定的键的数组。
这里有两种创建关联数组的方法:
1 | $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); |
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
3. 控制结构
3.1 条件语句
PHP有if、else if、else和switch语句。
1 |
|
3.2 循环
PHP支持多种循环,包括for、while、do…while和foreach。
1 |
|
4. 函数
PHP有许多内置函数,也可以定义自己的函数。
1 |
|
函数可以有参数和返回值。
1 |
|
PHP 魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。
不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
例如 LINE 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:
1 |
|
FILE
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
自 PHP 4.0.2 起,FILE 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
1 |
|
DIR
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
1 |
|
FUNCTION
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
以上实例输出结果为:
1 | 函数名为:test |
CLASS
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 CLASS 对 trait 也起作用。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。
"; echo '函数名为:' . __FUNCTION__ ; } } $t = new test(); $t->_print(); ?>以上实例输出结果为:
1 | 类名为:test |
TRAIT
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
sayHello(); ?>以上例程会输出:
1 | Hello World! |
METHOD
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
实例:
以上实例输出结果为:
1 | 函数名为:test |
NAMESPACE
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
实例:
以上实例输出结果为:
1 | 命名空间为:"MyProject" |
在PHP中,面向对象编程(Object-Oriented Programming, OOP)是一种重要的编程范式,它通过使用“类”(Class)和“对象”(Object)的概念来组织和结构化代码。下面是对PHP中类和对象的基本概念和用法的简要介绍:
类(Class)
类是创建对象的蓝图,它定义了一组属性(数据成员)和方法(成员函数)的结构。你可以将类想象为一个模板或者原型,用来生成具有相似特性和行为的对象。
定义类
在PHP中,使用class
关键字来定义一个类,并在类体内声明属性和方法。
1 | class Car { |
对象(Object)
对象是类的实例,即根据类的定义创建的具体实体。每个对象都有其自身的属性值,可以执行类中定义的方法。
创建对象
使用new
关键字来创建一个类的实例(对象)。
1 | $myCar = new Car("Red", "Toyota Camry"); |
访问属性和方法
创建对象后,可以使用“->”操作符来访问对象的属性和调用方法。
1 | echo $myCar->color; // 输出: Red |
总结
- 类是定义对象特性和行为的模板。
- 对象是类的实例,是根据类定义创建的具体实体。
- 使用
class
关键字定义类,使用public
、private
或protected
等访问修饰符来控制属性和方法的可见性。 - 通过
new
关键字创建对象实例。 - 使用“->”操作符访问对象的属性和方法。
面向对象编程允许你以更加模块化的方式编写代码,提高代码的重用性、可维护性和灵活性。
5. 表单处理
当然,让我们详细探讨一下PHP处理表单的各个方面,包括创建表单、接收与验证数据、错误处理、以及安全性考虑。
1. 创建HTML表单
输入类型
- 文本输入 (
<input type="text">
):用于输入短文本,如用户名。 - 密码输入 (
<input type="password">
):用于输入密码,显示为星号。 - 电子邮件输入 (
<input type="email">
):自动验证电子邮件格式。 - 文本区域 (
<textarea>
):用于多行文本输入。 - 复选框 (
<input type="checkbox">
) 和 单选按钮 (<input type="radio">
):用于多项选择。 - 下拉列表 (
<select>
):提供选项供用户选择。 - 文件上传 (
<input type="file">
):允许用户选择文件上传。
表单属性
action
: 指定处理表单数据的服务器端脚本URL。method
: 提交方式,GET
用于简单查询,参数显示在URL中;POST
用于提交大量数据或敏感数据,数据不会显示在URL中。
2. 接收表单数据
在PHP中,使用$_GET
或$_POST
数组(根据表单的method
属性)接收数据。例如,如果表单使用POST
方法提交:
1 | $username = $_POST['username']; // 获取名为username的输入值 |
3. 数据验证
基础验证
- 存在性检查:确保字段非空。
- 格式验证:使用正则表达式或内置函数,如
filter_var()
进行格式检查。 - 长度限制:检查输入长度是否符合要求。
使用filter_var
PHP的filter_var
函数提供了多种过滤器,用于数据验证和清理。
1 | $email = $_POST['email']; |
4. 数据清理与转义
- htmlspecialchars:防止XSS攻击,将特殊字符转换成HTML实体。
- trim:去除字符串首尾空白。
- mysqli_real_escape_string 或 PDO预处理语句:防止SQL注入。
5. 错误处理与用户反馈
- 显示明确的错误信息给用户,指出哪些字段需要修正。
- 可以使用
<div>
标签或CSS样式高亮显示错误字段。 - 保持用户输入:在表单重显时,使用PHP变量回填已输入的合法数据。
6. 表单重定向与防止重复提交
- 使用HTTP重定向(
header('Location: ...')
)在处理完表单后引导用户到新的页面。 - 添加令牌(Token)防止表单重复提交。
7. 安全性最佳实践
- 验证所有输入:不要信任任何用户输入。
- 使用预处理语句:在数据库操作中避免SQL注入。
- 启用CSP(内容安全策略):帮助防御XSS攻击。
- HTTPS:对敏感数据使用SSL/TLS加密传输。
通过遵循上述步骤和最佳实践,可以有效地创建和处理表单,同时确保应用的安全性和用户体验。
PHP非常适合处理HTML表单。
1 |
|
PHP 中的 $_GET 和 $_POST 变量用于检索表单中的信息,比如用户输入。
有一点很重要的事情值得注意,当处理 HTML 表单时,PHP 能把来自 HTML 页面中的表单元素自动变成可供 PHP 脚本使用
PHP处理表单是Web开发中的常见任务,它涉及收集用户输入并通过HTML表单传递给服务器端的PHP脚本进行处理。以下是使用PHP进行表单操作的基本步骤:
1. 创建HTML表单
首先,你需要在HTML中创建表单,定义输入字段、提交按钮等元素,并指定表单提交的目标PHP文件(action
属性)及提交方式(method
属性,通常是GET
或POST
)。
1 | <form action="process_form.php" method="POST"> |
2. 处理表单数据
在指定的PHP文件(如上例中的process_form.php
)中,你可以使用$_POST
或$_GET
超全局变量来访问提交的数据,具体取决于表单的提交方式。
1 |
|
3. 验证和清理输入
在实际应用中,接收到的表单数据需要经过验证和清理,以防止SQL注入、跨站脚本(XSS)等安全威胁。可以使用PHP的filter_var()
函数或其他安全措施来实现。
1 | $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); |
PHP $_GET 变量
在 PHP 中,预定义的 $_GET 变量用于收集来自 method=”get” 的表单中的值。
$_GET 变量
预定义的 $_GET 变量用于收集来自 method=”get” 的表单中的值。
从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
1 | <html> |
在 HTML 表单中使用 method=”get” 时,所有的变量名和值都会显示在 URL 中。
注释:所以在发送密码或其他敏感信息时,不应该使用这个方法!
然而,正因为变量显示在 URL 中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。
注释:HTTP GET 方法不适合大型的变量值。它的值是不能超过 2000 个字符的。
PHP $_POST 变量
在 PHP 中,预定义的 $_POST 变量用于收集来自 method=”post” 的表单中的值。
$_POST 变量
预定义的 $_POST 变量用于收集来自 method=”post” 的表单中的值。
从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
注释:然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。
实例
1 | <html> |
从带有 POST 方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。
然而,由于变量不显示在 URL 中,所以无法把页面加入书签。
数据库连接
PHP通常与MySQL数据库一起使用。以下是一个简单的数据库连接示例:
1 |
|
mysqli
是 PHP 中用于与 MySQL 数据库交互的一个扩展库。它是 “MySQL Improved” 的缩写,设计来替代旧的 mysql
扩展,提供了更好的性能和更多的功能,包括对面向对象编程的支持、预处理语句、多语句执行和存储过程等。
使用 mysqli
扩展与 MySQL 数据库交互的基本步骤通常包括:
- 创建数据库连接:通过
new mysqli($servername, $username, $password, $dbname)
创建一个连接对象,其中$servername
是数据库服务器地址,$username
和$password
分别是数据库的用户名和密码,$dbname
是要连接的数据库名。 - 检查连接:使用
if ($connection->connect_error)
来检查连接是否成功。如果不成功,可以通过$connection->connect_error
获取错误信息。 - 执行查询:可以使用
$connection->query($sql)
方法执行SQL查询,其中$sql
是包含SQL命令的字符串。 - 处理结果:根据执行的查询类型(如 SELECT 查询),可能需要获取结果集并遍历或操作这些结果。
- 关闭连接:在完成所有数据库操作后,使用
$connection->close();
关闭数据库连接,释放资源。
die()
函数是 PHP 中的一个内置函数,当调用它时,会立即停止(终止)当前脚本的执行。此函数常用于在发生错误或遇到无法继续执行程序的情况时,输出一条消息并退出脚本。它可选地接受一个参数,该参数可以是字符串、数字或其他类型,会被转换为字符串形式并输出到浏览器或控制台。
例如,在数据库连接失败时使用 die()
函数的场景
1 | if ($c->connect_error) { |
在这段代码中,如果数据库连接失败,$c->connect_error
将包含错误描述。die()
函数被用来输出这条错误信息,并且之后的任何代码都不会被执行,因为脚本已经终止了。
需要注意的是,虽然 die()
函数在处理错误时很方便,但在更复杂的错误处理逻辑中,可能更倾向于使用异常处理机制(try-catch 语句块),以实现更精细的控制流管理。不过,在简单脚本或快速原型开发中,die()
或其同义词 exit()
仍然非常常用。
$c->connect_error
是在使用 PHP 的 mysqli
扩展连接数据库时,检查连接是否成功的一种方式。这里 $c
是创建的 mysqli
对象,代表了到MySQL服务器的数据库连接。当尝试建立连接时,如果发生任何错误,$c->connect_error
属性会被自动填充错误信息。
具体来说:
$c
:这是你给mysqli
类实例化后的对象的引用。通过这个对象,你可以调用各种方法来执行SQL查询、获取结果等操作。->
:这是 PHP 中用于访问对象属性或方法的箭头符号。connect_error
:这是一个只读属性,表示上一次连接尝试时发生的错误。如果连接成功,这个属性的值是null
;如果连接失败,它将包含一个描述错误的字符串。
因此,$c->connect_error
的检查通常紧跟着 new mysqli(...)
语句之后,用来判断数据库连接是否建立成功。如果该属性不为空,说明连接过程中遇到了问题,这时可以根据错误信息采取相应的错误处理措施,比如使用 die()
函数输出错误信息并终止脚本执行。