文章目录
- 一、$GLOBALS
- 1. 在函数内部访问全局变量
- 2. 在函数内部修改全局变量
- 3. 注意事项
- 二、$_SERVER
- 三、$_REQUEST
- 1. 从 GET 请求中获取数据
- 2. 从 POST 请求中获取数据
- 3. 注意事项
- 四、$_POST
- 五、$_GET
- 六、$_FILES
- 七、$_ENV
- 八、$_COOKIE
- 九、$_SESSION
- 十、相关链接
一、$GLOBALS
$GLOBALS 是一个超全局变量,在 PHP 中用于访问全局作用域内的所有变量。这个超全局变量实际上是一个包含所有全局变量的数组。你可以通过 $GLOBALS 数组来访问和修改全局作用域中的任何变量,即使在函数或方法内部。
1. 在函数内部访问全局变量
$x = 10;
$y = 20;function add() {$sum = $GLOBALS['x'] + $GLOBALS['y'];echo $sum; // 输出 30
}add();
在这个例子中,$x 和 $y 是全局变量。在 add() 函数内部,我们通过 $GLOBALS 数组访问这两个全局变量,并将它们相加。
2. 在函数内部修改全局变量
$name = "Alice";function setName($newName) {$GLOBALS['name'] = $newName;
}setName("Bob");
echo $name; // 输出 Bob
在这个例子中,我们定义了一个函数 setName(),它接受一个参数 $newName 并使用 $GLOBALS 来修改全局变量 $name 的值。
3. 注意事项
$GLOBALS 提供了一种访问全局变量的方式,但过度依赖它通常不是一个好的编程实践。全局变量可能导致代码难以理解和维护,因为它们可以在任何地方被修改。在面向对象编程中,更推荐使用类的属性和方法来管理状态,而不是全局变量。
二、$_SERVER
$_SERVER 是一个超全局变量,在 PHP 中用于收集关于当前脚本环境的信息,以及关于客户端请求的信息。$_SERVER 数组包含了由 web 服务器创建的信息,例如请求头、路径和脚本位置等。这些信息可以用来处理请求、重定向、生成动态内容等。
下面是一些 $_SERVER 数组中常见的键及其描述:
$_SERVER['PHP_SELF']:当前执行脚本的文件名。这常常用于表单处理,以便知道表单数据发送到哪里。$_SERVER['REQUEST_METHOD']:请求使用的 HTTP 方法,如 “GET” 或 “POST”。$_SERVER['REQUEST_URI']:访问此页面所需的完整的 URL。$_SERVER['HTTP_HOST']:当前请求的主机头信息。$_SERVER['HTTP_USER_AGENT']:发送请求的浏览器类型、版本、操作系统等信息。$_SERVER['SERVER_NAME']:当前脚本所在服务器的主机名。$_SERVER['SERVER_PORT']:服务器所使用的端口号。$_SERVER['DOCUMENT_ROOT']:当前运行脚本所在的文档根目录。$_SERVER['SCRIPT_NAME']:当前脚本的路径。$_SERVER['QUERY_STRING']:URL 中 ‘?’ 后面的参数,如果有的话。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {// 处理 POST 请求$name = $_POST['name'];echo "Hello, " . htmlspecialchars($name);
}
?><form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">Name: <input type="text" name="name"><input type="submit" value="Submit">
</form>
在这个例子中,<form> 元素的 action 属性被设置为 $_SERVER['PHP_SELF'],这样表单数据就会被发送到当前脚本。当表单提交后,脚本会检查 $_SERVER["REQUEST_METHOD"] 是否为 “POST”,如果是,则处理提交的数据。
三、$_REQUEST
$_REQUEST 是一个超全局变量,在 PHP 中用于收集通过 HTTP 请求发送的参数,这些参数可以来自 GET、POST 或 COOKIE 方法。$_REQUEST 数组包含了从客户端发送到当前脚本的所有关联数组。这使得它可以方便地访问通过不同 HTTP 方法发送的数据。
下面是一些关于 $_REQUEST 的示例和解释:
1. 从 GET 请求中获取数据
假设你的 URL 是 http://example.com/test.php?name=John&age=30,你可以在 test.php 中使用 $_REQUEST 来获取这些参数:
<?php
$name = $_REQUEST['name']; // $name 的值是 "John"
$age = $_REQUEST['age']; // $age 的值是 "30"
echo "Hello, $name! You are $age years old.";
?>
2. 从 POST 请求中获取数据
如果用户通过表单以 POST 方法提交数据,你也可以使用 $_REQUEST 来获取这些数据:
<form method="post" action="test.php">Name: <input type="text" name="name">Age: <input type="text" name="age"><input type="submit" value="Submit">
</form>
然后在 test.php 中:
<?php
$name = $_REQUEST['name'];
$age = $_REQUEST['age'];
echo "Hello, $name! You entered $age as your age.";
?>
3. 注意事项
虽然 $_REQUEST 提供了方便的方式来获取请求参数,但它并不是最佳实践,特别是当涉及到安全性时。因为 $_REQUEST 会从 $_GET、$_POST 和 $_COOKIE 中获取数据,这可能导致意外的副作用或安全问题。
- 安全性:
$_REQUEST可能会暴露原本只应通过 POST 方法发送的敏感数据,因为它也会从$_GET中获取数据。GET 请求通常会被浏览器、服务器和代理等记录在日志中,因此不适合发送敏感信息。 - 可预测性:使用
$_POST或$_GET可以更明确地表明你的意图,使得代码更易于理解和维护。 - 数据验证:不论使用
$_REQUEST还是其他超全局变量,你都应该始终验证和清理用户输入,以防止潜在的安全漏洞,如 SQL 注入或跨站脚本攻击(XSS)。
因此,除非你有特别的原因需要使用 $_REQUEST,否则最好明确地从 $_GET、$_POST 或 $_COOKIE 中获取数据,并始终对用户输入进行验证和清理。
四、$_POST
$_POST 是 PHP 中的一个超全局变量,用于收集通过 HTTP POST 方法发送的表单数据。当用户提交一个 HTML 表单,并且表单的 method 属性设置为 POST 时,表单的数据就会被发送到服务器,然后可以通过 $_POST 数组在 PHP 脚本中访问这些数据。
$_POST 数组中的每个元素都对应着表单中的一个输入字段,数组的键是输入字段的 name 属性值,数组的值是用户输入的数据。
下面是一个简单的示例,展示了如何使用 $_POST 来收集和处理表单数据:
HTML 表单(假设保存为 form.html):
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>POST Form Example</title>
</head>
<body><form action="process_form.php" method="post"><label for="name">Name:</label><input type="text" id="name" name="name" required><br><label for="email">Email:</label><input type="email" id="email" name="email" required><br><input type="submit" value="Submit"></form>
</body>
</html>
PHP 脚本(假设保存为 process_form.php):
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {// 检查是否设置了 name 和 email 字段,并且它们不为空if (isset($_POST['name']) && isset($_POST['email'])) {$name = $_POST['name'];$email = $_POST['email'];// 可以在这里对数据进行处理,比如保存到数据库或者发送电子邮件echo "Name: " . htmlspecialchars($name) . "<br>";echo "Email: " . htmlspecialchars($email);} else {echo "Name and email are required.";}
} else {echo "This page should not be accessed directly.";
}
?>
在这个例子中,当用户填写表单并提交时,数据会被发送到 process_form.php。PHP 脚本首先检查请求的方法是否为 POST,然后检查 $_POST 数组中是否存在 name 和 email 键。如果存在并且它们有值,脚本就会处理这些数据(在这个例子中,只是简单地输出它们)。
请注意,使用 htmlspecialchars() 函数是为了防止跨站脚本攻击(XSS)。它可以将特殊字符转换为 HTML 实体,从而避免恶意脚本的执行。
此外,虽然 $_POST 提供了方便的方式来收集表单数据,但始终需要验证和清理用户输入,以防止潜在的安全问题,如 SQL 注入等。在处理用户输入时,应该使用适当的数据验证和过滤技术。
五、$_GET
$_GET 是 PHP 中的一个超全局变量,用于收集通过 HTTP GET 方法发送的表单数据或 URL 中的查询字符串参数。当用户提交一个 HTML 表单,并且表单的 method 属性设置为 GET 时,表单的数据就会附加到 URL 上,然后通过 $_GET 数组在 PHP 脚本中访问这些数据。
$_GET 数组中的每个元素都对应着 URL 中的一个参数,数组的键是参数的名称,数组的值是参数的值。这些参数通常位于 URL 的问号(?)之后,并且每个参数之间用和号(&)分隔。
下面是一个简单的示例,展示了如何使用 $_GET 来收集和处理 URL 中的参数:
HTML 表单(假设保存为 form_get.html):
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>GET Form Example</title>
</head>
<body><form action="process_get.php" method="get"><label for="name">Name:</label><input type="text" id="name" name="name" required><br><input type="submit" value="Submit"></form>
</body>
</html>
PHP 脚本(假设保存为 process_get.php):
<?php
if ($_SERVER["REQUEST_METHOD"] == "GET") {// 检查是否设置了 name 字段if (isset($_GET['name'])) {$name = $_GET['name'];// 可以在这里对数据进行处理,比如保存到数据库或者用于页面显示echo "Hello, " . htmlspecialchars($name) . "!";} else {echo "Name is required.";}
} else {echo "This page should not be accessed directly.";
}
?>
在这个例子中,当用户填写表单并提交时,数据会被附加到 URL 上,并发送到 process_get.php。PHP 脚本首先检查请求的方法是否为 GET,然后检查 $_GET 数组中是否存在 name 键。如果存在,脚本就会处理这个数据(在这个例子中,只是简单地输出一个问候语)。
请注意,由于 GET 请求的数据直接附加在 URL 上,因此它不适合发送敏感信息或大量数据。此外,由于 URL 的长度有限制,因此 GET 请求也可能受到数据大小的限制。
同样地,使用 htmlspecialchars() 函数是为了防止跨站脚本攻击(XSS)。它可以将特殊字符转换为 HTML 实体,从而避免恶意脚本的执行。
在处理通过 $_GET 收集的数据时,始终应该进行验证和清理,以确保数据的安全性和准确性。
六、$_FILES
$_FILES 是 PHP 中的一个超全局变量,用于处理通过 HTTP POST 方法上传的文件。当用户通过表单上传文件时,上传的文件信息会存储在 $_FILES 数组中。这个数组包含了关于上传文件的详细信息,如文件名、文件类型、文件大小以及临时文件路径等。
$_FILES 数组的结构是一个关联数组,其键是表单中 <input type="file"> 标签的 name 属性值。每个文件上传字段都对应一个子数组,该子数组包含以下键:
name:上传的文件的原始文件名。type:上传的文件的 MIME 类型。size:上传的文件大小(以字节为单位)。tmp_name:上传的文件的临时文件名,文件被保存在服务器上的临时位置。error:文件上传的错误代码。
下面是一个简单的示例,展示了如何使用 $_FILES 来处理文件上传:
HTML 表单(假设保存为 upload_form.html):
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>File Upload Form</title>
</head>
<body><form action="upload_process.php" method="post" enctype="multipart/form-data"><label for="file">Select a file:</label><input type="file" id="file" name="fileToUpload"><input type="submit" value="Upload"></form>
</body>
</html>
PHP 脚本(假设保存为 upload_process.php):
<?php
$targetDirectory = "uploads/";
$targetFile = $targetDirectory . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($targetFile,PATHINFO_EXTENSION));// 检查文件是否已经存在
if (file_exists($targetFile)) {echo "Sorry, file already exists.";$uploadOk = 0;
}// 检查文件大小
if ($_FILES["fileToUpload"]["size"] > 500000) { // 500KBecho "Sorry, your file is too large.";$uploadOk = 0;
}// 允许特定文件格式
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";$uploadOk = 0;
}// 检查 $uploadOk 是否为 0
if ($uploadOk == 0) {echo "Sorry, your file was not uploaded.";
} else {if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";} else {echo "Sorry, there was an error uploading your file.";}
}
?>
在这个例子中,用户选择一个文件后,点击上传按钮,文件会被发送到 upload_process.php 脚本。脚本首先定义了一个目标目录和一个目标文件名,然后检查文件是否已存在、文件大小是否超过限制以及文件格式是否允许。最后,如果所有检查都通过,脚本会使用 move_uploaded_file() 函数将临时文件移动到目标位置。
处理文件上传时,安全性非常重要。务必验证上传的文件类型、大小以及是否包含潜在的恶意内容。此外,还应该确保目标目录是可写的,并且服务器配置允许文件上传。
七、$_ENV
$_ENV 是 PHP 中的一个超全局变量,用于访问环境变量。环境变量是在操作系统级别设置的变量,它们可以被运行在该操作系统上的所有进程访问。在 PHP 脚本中,$_ENV 数组用于存储这些环境变量的名称和值。
当 PHP 脚本运行时,它会从操作系统获取当前的环境变量,并将它们存储在 $_ENV 数组中。这样,你就可以在 PHP 脚本中通过访问 $_ENV 数组来获取和操作这些环境变量的值。
例如,你可以使用以下代码来访问名为 PATH 的环境变量的值:
if (isset($_ENV['PATH'])) {echo "PATH: " . $_ENV['PATH'];
} else {echo "PATH environment variable is not set.";
}
需要注意的是,不是所有的环境变量都会自动填充到 $_ENV 数组中。这取决于 PHP 的配置和服务器设置。在某些服务器上,为了安全起见,可能会限制或禁用对环境变量的访问。
此外,你也可以在 PHP 配置文件中(通常是 php.ini)设置 variables_order 指令来控制哪些超全局变量(包括 $_ENV)会被注册。例如,将 variables_order 设置为 "EGPCS" 会注册 $_ENV 和 $_GET、$_POST、$_COOKIE 和 $_SERVER 变量。
如果你发现 $_ENV 数组中没有你期望的环境变量,你可能需要检查你的 PHP 配置和服务器设置,或者考虑使用 getenv() 函数来直接获取环境变量的值。例如:
$path = getenv('PATH');
if ($path) {echo "PATH: " . $path;
} else {echo "PATH environment variable is not set.";
}
getenv() 函数允许你获取单个环境变量的值,而不需要依赖 $_ENV 数组。
八、$_COOKIE
$_COOKIE 是 PHP 中的一个超全局变量,用于收集通过 HTTP Cookie 发送的用户信息。Cookie 是在用户的浏览器上存储的小段数据,通常用于识别用户会话或跟踪用户行为。当浏览器访问网站时,它会自动将相关的 Cookie 发送到服务器,然后 PHP 可以通过 $_COOKIE 数组来访问这些 Cookie 的值。
当用户首次访问网站时,服务器可能会设置一个或多个 Cookie,并在后续的请求中,浏览器会自动将这些 Cookie 发送回服务器。PHP 脚本可以使用 $_COOKIE 数组来读取这些值,并根据需要进行处理。
下面是一个简单的示例,展示了如何设置和读取 Cookie:
设置 Cookie(假设保存为 set_cookie.php):
<?php
// 设置一个名为 "username" 的 Cookie,值为 "JohnDoe"
setcookie("username", "JohnDoe", time() + (86400 * 30), "/"); // 有效期为 30 天
?>
读取 Cookie(假设保存为 read_cookie.php):
<?php
// 检查 "username" Cookie 是否设置
if(isset($_COOKIE["username"])) {echo "Welcome, " . $_COOKIE["username"] . "!";
} else {echo "Welcome, Guest!";
}
?>
在这个例子中,setcookie() 函数用于设置 Cookie。它接受至少三个参数:Cookie 的名称、Cookie 的值以及 Cookie 的过期时间(以 Unix 时间戳表示)。可选的第四个参数是 Cookie 的路径,它定义了哪些页面可以接收这个 Cookie。在这个例子中,我们设置了路径为 "/",这意味着该 Cookie 对整个网站都有效。
然后,在 read_cookie.php 脚本中,我们使用 isset() 函数来检查 $_COOKIE 数组中是否存在名为 “username” 的键。如果存在,我们就输出欢迎信息,并将用户名显示为 Cookie 的值。如果不存在,我们输出默认的欢迎信息。
由于安全原因,不应该在 Cookie 中存储敏感信息,如密码或私钥。此外,由于 Cookie 存储在用户的浏览器上,因此它们的大小和内容都受到浏览器和 HTTP 规范的限制。
九、$_SESSION
$_SESSION 是 PHP 中的一个超全局变量,用于在用户会话期间跟踪和存储信息。当 PHP 脚本以会话的方式运行时,可以使用 $_SESSION 变量在用户的不同页面请求之间保存和传递数据。
要使用 $_SESSION,你需要先启动一个会话,这通常是通过调用 session_start() 函数来完成的。一旦会话启动,你就可以向 $_SESSION 数组中添加数据,然后在后续的页面请求中访问这些数据。
下面是一个简单的示例,展示了如何使用 $_SESSION 来存储和读取用户数据:
<?php
// 启动会话
session_start();// 存储数据到 $_SESSION
$_SESSION["username"] = "JohnDoe";// 可以在同一页面或后续页面读取数据
if(isset($_SESSION["username"])) {echo "Welcome, " . $_SESSION["username"] . "!";
} else {echo "Welcome, Guest!";
}// 结束会话(可选,PHP 脚本结束时会自动结束)
session_write_close();
?>
在这个例子中,我们首先调用 session_start() 来启动会话。然后,我们将用户名 “JohnDoe” 存储在 $_SESSION["username"] 中。在后续的代码中,我们可以检查 $_SESSION["username"] 是否设置,并据此输出不同的欢迎信息。
会话数据存储在服务器上,并且与特定的用户会话相关联。每个用户会话都有一个唯一的会话 ID,该 ID 通常通过 Cookie 发送到用户的浏览器,以便在后续的请求中识别用户会话。这意味着,即使用户关闭了浏览器窗口或重启了计算机,只要 Cookie 仍然有效,会话数据就会保留在服务器上,并在用户下次访问时可用。
为了安全起见,你应该确保会话 ID 是通过安全的连接(如 HTTPS)传输的,以防止会话劫持攻击。此外,你还应该定期清理旧的会话数据,以避免会话固定攻击和占用过多的服务器资源。这通常通过设置会话的过期时间和定期清理会话存储来实现。
十、相关链接
- php官网
- php_Github
- PHP实现Token
- 「PHP系列」PHP简介与起步
- 「PHP系列」PHP语法介绍
- 「PHP系列」PHP变量
- 「PHP系列」PHP echo/print语句、数据类型详解
- 「PHP系列」PHP 常量/字符串、类型比较
- 「PHP系列」PHP 运算符详解
- 「PHP系列」If…Else语句/switch语句
- 「PHP系列」数组详解
- 「PHP系列」PHP数组排序及运用场景