PHP 基本概念详解
PHP是一种服务器端脚本语言,常用于动态网站开发和 web 应用程序。以下是 PHP 的基本概念与特点的详细说明:
1. PHP 文件的默认文件扩展名
- PHP 文件的扩展名通常为
.php
,例如index.php
。 - PHP 文件可以包含 PHP 代码、HTML、CSS 和 JavaScript。
- Web 服务器会通过 PHP 解析器处理
.php
文件中的 PHP 代码,并将结果返回给浏览器。
2. PHP 脚本的位置
PHP 脚本可以嵌套在 HTML 文档的任意位置。典型的嵌套示例:
<html> <body> <h1>欢迎访问我的网站</h1> <?php echo "这是一个 PHP 脚本块。"; ?> </body> </html>
AI 代码解读
也可以使用纯 PHP 脚本文件,无需包含 HTML:
<?php echo "这是一个纯 PHP 文件。"; ?>
AI 代码解读
3. PHP 脚本标记
PHP 脚本以 <?php
开头,以 ?>
结束。示例:
<?php echo "Hello, World!"; ?>
AI 代码解读
注意:短标签 <? ... ?>
在某些服务器配置中可能被禁用,建议使用完整标签 <?php ... ?>
。
4. PHP 语句结束标记
PHP 中的每个语句必须以分号 (;
) 结束。如果遗漏分号,可能导致解析错误。
示例:
<?php echo "这是第一条语句。"; echo "这是第二条语句。"; ?>
AI 代码解读
5. PHP 注释语法
单行注释:使用 //
或 #
注释单行代码:
<?php // 这是一个单行注释 # 这是另一个单行注释 echo "Hello, PHP!"; ?>
AI 代码解读
多行注释:使用 /*
开始,*/
结束,适用于多行:
<?php /* 这是一个多行注释 用于解释代码的功能或逻辑 */ echo "多行注释结束后运行的代码。"; ?>
AI 代码解读
6. PHP 是一门弱类型语言
弱类型语言意味着变量的类型可以根据赋值自动转换,无需显式声明类型。PHP 使用 $
符号定义变量,类型可以是字符串、整数、浮点数、数组等:
<?php $text = "这是一个字符串"; // 字符串 $number = 42; // 整数 $price = 19.99; // 浮点数 ?>
AI 代码解读
PHP 会根据上下文自动调整变量类型:
<?php $x = "5"; $y = 3; $sum = $x + $y; // $x 被自动转换为整数 echo $sum; // 输出 8 ?>
AI 代码解读
7. PHP 的特点
- 跨平台:PHP 可以运行在 Windows、Linux 和 macOS 等多种操作系统上。
- 开源:PHP 是免费的,且有广泛的社区支持。
- 嵌套能力:PHP 可与 HTML 紧密结合,用于生成动态内容。
- 丰富的扩展库:PHP 提供大量扩展,用于处理数据库、文件、网络协议等。
PHP 中的变量及其类型详解
1. PHP 中变量的定义
PHP 中的变量以 $
开头,后跟变量名。变量名必须以字母或下划线开头,后面可以跟字母、数字或下划线。变量名区分大小写。
示例:
<?php $name = "Alice"; // 字符串 $age = 25; // 整数 ?>
AI 代码解读
2. PHP 变量的类型
PHP 是弱类型语言,变量的类型可以根据赋值自动确定。以下是 PHP 支持的主要变量类型:
1) 字符串 (String)
用于存储文本数据。字符串可以用单引号 '
或双引号 "
包裹。双引号支持变量解析和转义字符,单引号不支持变量解析。
示例:
<?php $str1 = "Hello, PHP!"; // 双引号字符串 $str2 = 'Hello, World!'; // 单引号字符串 $name = "Alice"; echo "My name is $name"; // 输出:My name is Alice echo 'My name is $name'; // 输出:My name is $name ?>
AI 代码解读
2) 整数 (Integer)
用于存储整数值(正数、负数或 0)。必须是无小数点的数字。支持十进制、八进制(以 0
开头)、十六进制(以 0x
开头)和二进制(以 0b
开头)。
示例:
<?php $int1 = 42; // 十进制 $int2 = 0b101010; // 二进制 $int3 = 0x2A; // 十六进制 $int4 = 052; // 八进制 echo $int1; // 输出:42 ?>
AI 代码解读
3) 浮点数 (Float)
用于存储带小数点的数字或科学计数法表示的数字。
示例:
<?php $float1 = 3.14159; // 小数 $float2 = 1.2e3; // 科学计数法 (1.2 * 10^3) $float3 = 7E-10; // 科学计数法 (7 * 10^-10) echo $float1; // 输出:3.14159 ?>
AI 代码解读
4) 布尔值 (Boolean)
用于存储逻辑值:true
或 false
。常用于条件判断。
示例:
<?php $isPHPFun = true; $isHard = false; if ($isPHPFun) { echo "PHP is fun!"; } ?>
AI 代码解读
5) 数组 (Array)
数组用于存储多个值。PHP 中数组分为以下三类:
索引数组 (Indexed Array): 使用数字索引。
关联数组 (Associative Array): 使用键值对,键为字符串。
多维数组 (Multidimensional Array): 包含多个数组作为其元素的数组。
a) 索引数组
元素按数字索引从 0 开始。
示例:
<?php $fruits = array("Apple", "Banana", "Cherry"); echo $fruits[0]; // 输出:Apple ?>
AI 代码解读
也可以使用 []
语法定义:
<?php $fruits = ["Apple", "Banana", "Cherry"]; echo $fruits[1]; // 输出:Banana ?>
AI 代码解读
b) 关联数组
元素使用字符串作为键。
示例:
<?php $person = array( "name" => "Alice", "age" => 25, "city" => "New York" ); echo $person["name"]; // 输出:Alice ?>
AI 代码解读
c) 多维数组
数组的元素可以是另一个数组。
示例:
<?php $matrix = array( array(1, 2, 3), array(4, 5, 6), array(7, 8, 9) ); echo $matrix[1][2]; // 输出:6 ?>
AI 代码解读
6) 对象 (Object)
PHP 使用类和对象支持面向对象编程。
示例:
<?php class Person { public $name; public $age; function __construct($name, $age) { $this->name = $name; $this->age = $age; } function greet() { return "Hello, my name is $this->name and I am $this->age years old."; } } $person = new Person("Alice", 25); echo $person->greet(); // 输出:Hello, my name is Alice and I am 25 years old. ?>
AI 代码解读
7) NULL
NULL
是一个特殊的值,用于表示变量没有值。可以通过赋值 NULL
来清空变量。
示例:
<?php $var = "Hello, PHP!"; $var = NULL; // 现在 $var 没有值 ?>
AI 代码解读
3. 变量类型的动态转换
PHP 会根据上下文自动转换变量类型(类型转换)。
示例:
<?php $x = "5"; $y = 10; $sum = $x + $y; // 自动将 $x 转换为整数 echo $sum; // 输出:15 ?>
AI 代码解读
如何自定义 PHP 变量
在 PHP 中,变量是用来存储数据的标识符,可以是任何类型的值,例如字符串、整数、数组等。以下是自定义变量的详细规则和示例:
1. 使用 **$**
定义变量
所有变量必须以美元符号($
)开头。后面紧跟变量的名称,这个名称可以是一个有效的标识符。赋值时,使用等号 =
将值赋给变量。
示例:
<?php $name = "Alice"; // 定义变量 $name,并赋值为字符串 "Alice" $age = 25; // 定义变量 $age,并赋值为整数 25 $isStudent = true; // 定义变量 $isStudent,并赋值为布尔值 true ?>
AI 代码解读
2. 变量名称规则
(1) 变量名称不能以数字开头
变量名必须以字母或下划线开头。
不允许以下格式:
<?php $1var = "Invalid"; // 错误 $123name = "Invalid"; // 错误 ?>
AI 代码解读
正确的格式:
<?php $var1 = "Valid"; // 正确 $_name = "Valid"; // 正确 ?>
AI 代码解读
(2) 变量名称只能包含字母、数字和下划线
有效字符包括字母 (A-Z, a-z)、数字 (0-9) 和下划线 _
。
不允许的格式:
<?php $my-var = "Invalid"; // 错误,包含非法字符 "-" $my var = "Invalid"; // 错误,包含空格 ?>
AI 代码解读
正确的格式:
<?php $my_var = "Valid"; // 正确,使用下划线 $var123 = "Valid"; // 正确,包含数字 ?>
AI 代码解读
(3) 变量名称对大小写敏感
PHP 中的变量名称是区分大小写的。
示例:
<?php $name = "Alice"; $Name = "Bob"; echo $name; // 输出:Alice echo $Name; // 输出:Bob ?>
AI 代码解读
$name
和 $Name
是两个不同的变量。
3. 变量的赋值与初始化
变量在第一次赋值时被初始化。PHP 中未赋值的变量默认为 NULL
,但建议显式赋值。
示例:
<?php $count = 10; // 定义并初始化变量 $text = "Hello"; // 定义字符串变量 $empty; // 未初始化变量,默认为 NULL echo $empty; // 输出为空 ?>
AI 代码解读
4. 动态变量
PHP 支持动态变量,即变量的名称可以由另一个变量的值确定。
示例:
<?php $varName = "greeting"; // 定义变量名 $$varName = "Hello, World!"; // 定义动态变量 echo $greeting; // 输出:Hello, World! ?> ``` 解释:`$$varName` 等价于 `$greeting`。 #### **5. 命名约定与最佳实践** **遵循清晰和语义化的命名规则**:变量名应该能够描述其用途。 不推荐: ```plain <?php $x = "Alice"; // 变量名没有意义 $y = 25; // 变量名模糊 ?>
AI 代码解读
推荐:
<?php $userName = "Alice"; // 清晰的变量名 $userAge = 25; // 变量名具有语义 ?>
AI 代码解读
使用驼峰式命名或下划线命名:
驼峰式命名:$userName
, $productPrice
下划线命名:$user_name
, $product_price
避免使用保留字作为变量名:如 class
, function
, echo
等。
6. 变量的作用域
全局变量:定义在函数外部,作用域为整个脚本。
局部变量:定义在函数内部,仅在函数内可用。
示例:
<?php $globalVar = "I am global"; // 全局变量 function testScope() { $localVar = "I am local"; // 局部变量 echo $localVar; // 输出:I am local } testScope(); echo $globalVar; // 输出:I am global // echo $localVar; // 错误:未定义 ?>
AI 代码解读
PHP 预定义超全局变量
PHP 的 超全局变量是一组预定义的变量,可以在脚本的任何地方使用,而无需显式地声明为 global
。它们为处理用户输入、服务器环境信息、会话数据等提供了便利。
1. $GLOBALS
功能:包含所有全局作用域的变量。它是一个超全局数组,变量名作为键。作用:在函数或方法中访问全局变量。
示例:
<?php $x = 10; $y = 20; function calculateSum() { $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; // 使用$GLOBALS访问全局变量 } calculateSum(); echo $z; // 输出:30 ?>
AI 代码解读
2. $_SERVER
功能:存储服务器和执行环境的信息。它是一个数组,包含诸如请求头、路径和脚本位置等信息。
常用键值:
$_SERVER['PHP_SELF']
:当前执行脚本的文件名。
$_SERVER['SERVER_NAME']
:服务器的主机名。
$_SERVER['HTTP_HOST']
:当前请求的主机头。
$_SERVER['REMOTE_ADDR']
:客户端的 IP 地址。
$_SERVER['REQUEST_METHOD']
:请求方法(如 GET、POST)。
$_SERVER['QUERY_STRING']
:URL 中的查询字符串。
- 示例:
<?php echo $_SERVER['PHP_SELF']; // 输出当前脚本名 echo $_SERVER['SERVER_NAME']; // 输出服务器名 echo $_SERVER['REMOTE_ADDR']; // 输出客户端 IP ?>
AI 代码解读
3. $_GET(很常见)
功能:通过 URL 的查询字符串传递的变量。
用途:接收通过 HTTP GET 方法发送的数据。
特点:
数据附加在 URL 后(如 example.com/index.php?name=Alice
)。适合小型、非敏感数据的传递。
示例:
<?php // URL: example.com/index.php?name=Alice&age=25 $name = $_GET['name']; // 获取 URL 中的 name 参数 $age = $_GET['age']; // 获取 URL 中的 age 参数 echo "Name: $name, Age: $age"; // 输出:Name: Alice, Age: 25 ?>
AI 代码解读
4. $_POST(网安在抓包的时候经常看到POST请求)
功能:通过 HTTP POST 方法传递的变量。
用途:接收表单中通过 POST 方法发送的数据。
特点:数据不会显示在 URL 中,适合传递大量或敏感数据。
示例:
<?php // 表单提交后接收数据 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = $_POST['username']; $password = $_POST['password']; echo "Username: $username, Password: $password"; } ?>
AI 代码解读
5. $_REQUEST
功能:包含通过 GET、POST 或 COOKIE 方法传递的所有输入。
用途:访问用户输入的通用方法,但推荐使用 GET和_POST 来明确区分来源。
示例:
<?php $name = $_REQUEST['name']; // 可能来自 GET 或 POST echo "Hello, $name!"; ?>
AI 代码解读
6. $_SESSION
功能:存储会话变量,用于跨页面维持用户数据。特点:
需要启动会话:session_start()
。
数据存储在服务器端。
数据会在浏览器关闭后失效,除非配置会话持续时间。
示例:
<?php session_start(); // 开启会话 $_SESSION['user'] = "Alice"; // 设置会话变量 echo $_SESSION['user']; // 输出:Alice ?>
AI 代码解读
7. $_COOKIE
功能:通过客户端存储的小型数据,用于持久化跨会话的信息。
特点:
数据存储在客户端浏览器中。
设置 Cookie 使用 setcookie()
。
示例:
<?php // 设置一个 Cookie setcookie("username", "Alice", time() + 3600); // 1小时有效 echo $_COOKIE['username']; // 输出:Alice ?>
AI 代码解读
8. $_FILES
功能:处理文件上传的数据。
用途:在表单中上传文件,并获取文件信息。
常用键值:
$_FILES['file']['name']
:文件名。
$_FILES['file']['tmp_name']
:临时文件的路径。
$_FILES['file']['size']
:文件大小。
$_FILES['file']['error']
:错误代码。
示例:
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $fileName = $_FILES['file']['name']; $tmpPath = $_FILES['file']['tmp_name']; move_uploaded_file($tmpPath, "uploads/" . $fileName); // 保存文件 echo "File uploaded: $fileName"; } ?>
AI 代码解读
总结表
超全局变量 | 用途 | 备注 |
---|---|---|
$GLOBALS |
全局作用域的所有变量 | 用于函数中访问全局变量 |
$_SERVER |
服务器和环境信息 | 提供请求头、服务器信息等 |
$_GET |
URL 查询字符串的数据 | 数据可见于 URL,适合小型数据传递 |
$_POST |
表单通过 POST 提交的数据 | 数据不显示在 URL,适合敏感数据传递 |
$_REQUEST |
GET、POST 或 COOKIE 数据的集合 | 不推荐用于明确来源的数据 |
$_SESSION |
会话变量 | 数据存储在服务器端,需启动会话 |
$_COOKIE |
客户端存储的小型数据 | 数据存储于客户端浏览器 |
$_FILES |
文件上传相关信息 | 处理文件上传表单的数据 |
HTTP GET 和 POST 方法的区别
在 HTTP 协议中,GET 和 POST 是最常用的两种请求方法,用于客户端与服务器之间的数据交互。虽然它们的功能相似,但在用途和技术实现上有显著差异。
1. 数据传输方式
GET | POST |
---|---|
通过 URL 的查询字符串传输数据。 | 通过请求体(Body)传输数据。 |
数据直接附加在 URL 后,形式为 example.com?name=Alice&age=25 。 |
数据不显示在 URL 中,嵌入请求体,形式不可见。 |
2. 数据长度限制
GET | POST |
---|---|
数据长度有限制,因为 URL 的长度受到浏览器和服务器的限制(通常为 2048 个字符)。 | 无明显长度限制,可传输大量数据,具体限制取决于服务器设置。 |
3. 数据安全性
GET | POST |
---|---|
安全性较低,因为数据包含在 URL 中,容易被拦截或记录在浏览历史中。 | 相对安全,数据存储在请求体中,不会出现在浏览器地址栏,但仍需使用 HTTPS 保护。 |
4. 数据用途
GET | POST |
---|---|
用于请求数据。典型用途是获取资源,如网页或 API 数据。 | 用于提交数据。典型用途是提交表单或上传文件。 |
示例:查询用户信息。 | 示例:登录、注册。 |
5. 可缓存性
GET | POST |
---|---|
可以被缓存。浏览器和中间代理服务器会缓存 GET 请求。 | 不会被缓存。每次都会提交新的请求。 |
6. 浏览器行为
GET | POST |
---|---|
可通过浏览器的地址栏直接输入或保存为书签。 | 不能通过地址栏直接输入,也不能保存为书签。 |
可被搜索引擎索引。 | 不会被搜索引擎索引。 |
7. 常用场景
GET | POST |
---|---|
适用于查询操作,如搜索页面或获取资源信息。 | 适用于需要对服务器进行修改或提交敏感数据的操作。 |
示例:在线搜索、分页。 | 示例:提交表单、上传文件。 |
8. 示例代码
GET 示例
<?php // URL: example.com/index.php?name=Alice&age=25 echo "Name: " . $_GET['name']; // 获取 GET 参数 echo "Age: " . $_GET['age']; ?>
AI 代码解读
POST 示例
<form method="post" action="submit.php"> Name: <input type="text" name="name"> Age: <input type="text" name="age"> <input type="submit"> </form>
AI 代码解读
<?php echo "Name: " . $_POST['name']; // 获取 POST 参数 echo "Age: " . $_POST['age']; ?>
AI 代码解读
总结表
特点 | GET | POST |
---|---|---|
数据传输方式 | 数据附加在 URL 后,通过查询字符串传输 | 数据存储在请求体中,隐式传输 |
数据长度限制 | 有限,依赖于 URL 长度限制 | 理论上无限,但受服务器配置影响 |
数据安全性 | 较低,数据可被记录或拦截 | 较高,数据不可见,但需要 HTTPS 保护 |
数据用途 | 适合获取资源或查询 | 适合提交表单或敏感数据 |
可缓存性 | 可以缓存 | 不会缓存 |
浏览器支持 | 支持通过地址栏直接访问,URL 可分享 | 不支持通过地址栏访问,无法直接分享 |
常见用途 | 搜索、查询、分页 | 登录、注册、提交表单、文件上传 |
PHP函数
1. echo
作用:输出字符串或变量到页面。用途:在调试时显示变量值,生成页面内容。
特点:
不返回值,直接输出。
可输出多个字符串,逗号分隔。
示例:
$message = "Hello, World!"; echo $message; // 输出 Hello, World! echo "This ", "is ", "a ", "test."; // 输出 This is a test.
AI 代码解读
2. var_dump
作用:显示变量的详细信息,包括类型和值。
用途:调试时分析变量内容和数据结构。
特点:
可显示复杂数据类型(如数组、对象)。
输出包括变量类型和值,调试时非常实用。
示例:
$array = [1, "PHP", true]; var_dump($array); // 输出: // array(3) { // [0]=> int(1) // [1]=> string(3) "PHP" // [2]=> bool(true) // }
AI 代码解读
3. setcookie
作用:在客户端设置一个 cookie。
用途:用于会话管理、跟踪用户状态。
参数:
1. Cookie 名称。
2. Cookie 值。
3. 过期时间(时间戳)。
4. 可选路径、域名和安全选项。
AI 代码解读
示例:
setcookie("user", "Alice", time() + 3600, "/"); // 设置一个名为 user 的 cookie,有效期为 1 小时。
AI 代码解读
4. session_start
作用:启动一个会话,或恢复现有会话。
用途:用于保存用户状态信息,例如登录状态。
特点:
必须在任何输出之前调用。
默认会话数据存储在服务器上,通过客户端的 session ID 匹配。
示例:
session_start(); // 开启会话 $_SESSION['user'] = 'Alice'; // 设置会话变量 echo $_SESSION['user']; // 输出会话变量值
AI 代码解读
补充的安全相关 PHP 函数
在学习和实践网络安全时,这些 PHP 函数可以帮助保护应用程序免受常见漏洞的影响,并用于开发安全的代码。以下是详细的介绍:
1. 文件操作相关
**file_get_contents()**
作用:读取文件内容并以字符串形式返回。
用途:用于检测本地文件包含漏洞(LFI)或远程文件包含漏洞(RFI)。
示例:
$content = file_get_contents("config.txt"); echo $content; // 输出文件内容
AI 代码解读
**file_put_contents()**
作用:将数据写入文件(覆盖或追加)。
用途:测试文件操作漏洞或用于日志记录。
示例:
file_put_contents("log.txt", "Unauthorized access detected\n", FILE_APPEND);
AI 代码解读
**unlink()**
作用:删除指定文件。
用途:用于清理敏感文件或测试文件删除权限。
示例:
if (file_exists("temp.txt")) { unlink("temp.txt"); // 删除临时文件 }
AI 代码解读
2. 用户输入处理
**htmlspecialchars()**
作用:将 HTML 特殊字符转换为实体,防止 HTML 注入。
用途:防止 XSS(跨站脚本攻击)。
示例:
$user_input = '<script>alert("XSS")</script>'; echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); // 输出:<script>alert("XSS")</script>
AI 代码解读
**strip_tags()**
作用:移除字符串中的 HTML 和 PHP 标签。
用途:用于对用户输入的基本清理。
示例:
$input = '<p>Hello <b>World</b></p>'; echo strip_tags($input); // 输出:Hello World
AI 代码解读
**addslashes()**
作用:在字符串中的引号前添加反斜杠,转义特殊字符。
用途:保护数据免受 SQL 注入攻击。
示例:
$unsafe_data = "Alice's home"; $safe_data = addslashes($unsafe_data); echo $safe_data; // 输出:Alice\'s home
AI 代码解读
3. 数据库操作
**mysqli_real_escape_string()**
作用:转义 SQL 查询中的特殊字符。
用途:防止 SQL 注入。
示例:
$conn = new mysqli("localhost", "user", "password", "database"); $unsafe_input = "' OR '1'='1"; $safe_input = $conn->real_escape_string($unsafe_input); $query = "SELECT * FROM users WHERE username = '$safe_input'";
AI 代码解读
**PDO::prepare()**
作用:使用预编译语句,防止 SQL 注入。
用途:推荐的安全数据库查询方法。
示例:
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password"); $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username"); $stmt->execute(['username' => $unsafe_input]);
AI 代码解读
4. 加密与解密
**hash()**
作用:生成字符串的哈希值。
用途:用于存储密码或验证数据完整性。
示例:
$password = "securepassword"; $hashed_password = hash("sha256", $password);
AI 代码解读
**password_hash()**
作用:生成强散列密码。
用途:安全地存储用户密码。
示例:
$password = "securepassword"; $hash = password_hash($password, PASSWORD_DEFAULT);
AI 代码解读
**openssl_encrypt()**
/ **openssl_decrypt()**
作用:加密或解密数据。
用途:用于传输敏感信息的保护。
示例:
$data = "Sensitive Information"; $key = "encryptionkey"; $encrypted = openssl_encrypt($data, "AES-128-ECB", $key); $decrypted = openssl_decrypt($encrypted, "AES-128-ECB", $key);
AI 代码解读
5. 网络交互与响应
**header()**
作用:发送原始 HTTP 报头。
用途:用于设置重定向、防止缓存、或指定内容类型。
示例:
header("Location: login.php");
AI 代码解读
**http_response_code()**
作用:设置 HTTP 响应状态码。
用途:用于返回特定的 HTTP 状态(如 404, 500)。
示例:
http_response_code(404); echo "Page not found";
AI 代码解读
6. 全局变量管理
**$GLOBALS**
作用:访问所有全局变量。
用途:在需要跨函数共享数据时使用。
示例:
$x = 10; function test() { echo $GLOBALS['x']; // 输出 10 }
AI 代码解读
**session_start()**
作用:启动或恢复会话。
用途:管理用户登录状态。
示例:
session_start(); $_SESSION['user'] = 'Alice';
AI 代码解读
总结
以上函数涵盖了文件操作、用户输入过滤、数据库操作、加密解密和网络交互等安全开发的关键领域。结合这些函数,您可以有效防范常见的安全漏洞(如 XSS、SQL 注入、文件包含攻击等),并提高 PHP 应用的安全性。