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