「PHP系列」PHP超级全局变量详解

04-11 1786阅读

文章目录

  • 一、$GLOBALS
    • 1. 在函数内部访问全局变量
    • 2. 在函数内部修改全局变量
    • 3. 注意事项
    • 二、$_SERVER
    • 三、$_REQUEST
      • 1. 从 GET 请求中获取数据
      • 2. 从 POST 请求中获取数据
      • 3. 注意事项
      • 四、$_POST
      • 五、$_GET
      • 六、$_FILES
      • 七、$_ENV
      • 八、$_COOKIE
      • 九、$_SESSION
      • 十、相关链接

        一、$GLOBALS

        $GLOBALS 是一个超全局变量,在 PHP 中用于访问全局作用域内的所有变量。这个超全局变量实际上是一个包含所有全局变量的数组。你可以通过 $GLOBALS 数组来访问和修改全局作用域中的任何变量,即使在函数或方法内部。

        「PHP系列」PHP超级全局变量详解
        (图片来源网络,侵删)

        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 中 ‘?’ 后面的参数,如果有的话。
          
          

          2. 从 POST 请求中获取数据

          如果用户通过表单以 POST 方法提交数据,你也可以使用 $_REQUEST 来获取这些数据:

              Name: 
              Age: 
              
          
          

          然后在 test.php 中:

           
          

          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):

            
            
                
                POST Form Example
            
            
                
                    Name:
                    
                    
            Email:

            PHP 脚本(假设保存为 process_form.php):

             
            

            在这个例子中,当用户填写表单并提交时,数据会被发送到 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):

            
            
                
                GET Form Example
            
            
                
                    Name:
                    
                    

            PHP 脚本(假设保存为 process_get.php):

             
            

            在这个例子中,当用户填写表单并提交时,数据会被附加到 URL 上,并发送到 process_get.php。PHP 脚本首先检查请求的方法是否为 GET,然后检查 $_GET 数组中是否存在 name 键。如果存在,脚本就会处理这个数据(在这个例子中,只是简单地输出一个问候语)。

            请注意,由于 GET 请求的数据直接附加在 URL 上,因此它不适合发送敏感信息或大量数据。此外,由于 URL 的长度有限制,因此 GET 请求也可能受到数据大小的限制。

            同样地,使用 htmlspecialchars() 函数是为了防止跨站脚本攻击(XSS)。它可以将特殊字符转换为 HTML 实体,从而避免恶意脚本的执行。

            在处理通过 $_GET 收集的数据时,始终应该进行验证和清理,以确保数据的安全性和准确性。

            六、$_FILES

            $_FILES 是 PHP 中的一个超全局变量,用于处理通过 HTTP POST 方法上传的文件。当用户通过表单上传文件时,上传的文件信息会存储在 $_FILES 数组中。这个数组包含了关于上传文件的详细信息,如文件名、文件类型、文件大小以及临时文件路径等。

            $_FILES 数组的结构是一个关联数组,其键是表单中 标签的 name 属性值。每个文件上传字段都对应一个子数组,该子数组包含以下键:

            • name:上传的文件的原始文件名。
            • type:上传的文件的 MIME 类型。
            • size:上传的文件大小(以字节为单位)。
            • tmp_name:上传的文件的临时文件名,文件被保存在服务器上的临时位置。
            • error:文件上传的错误代码。

              下面是一个简单的示例,展示了如何使用 $_FILES 来处理文件上传:

              HTML 表单(假设保存为 upload_form.html):

              
              
                  
                  File Upload Form
              
              
                  
                      Select a file:
                      
                      
                  
              
              
              

              PHP 脚本(假设保存为 upload_process.php):

               
              

              在这个例子中,用户选择一个文件后,点击上传按钮,文件会被发送到 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):

               
              

              读取 Cookie(假设保存为 read_cookie.php):

               
              

              在这个例子中,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 来存储和读取用户数据:

               
              

              在这个例子中,我们首先调用 session_start() 来启动会话。然后,我们将用户名 “JohnDoe” 存储在 $_SESSION["username"] 中。在后续的代码中,我们可以检查 $_SESSION["username"] 是否设置,并据此输出不同的欢迎信息。

              会话数据存储在服务器上,并且与特定的用户会话相关联。每个用户会话都有一个唯一的会话 ID,该 ID 通常通过 Cookie 发送到用户的浏览器,以便在后续的请求中识别用户会话。这意味着,即使用户关闭了浏览器窗口或重启了计算机,只要 Cookie 仍然有效,会话数据就会保留在服务器上,并在用户下次访问时可用。

              为了安全起见,你应该确保会话 ID 是通过安全的连接(如 HTTPS)传输的,以防止会话劫持攻击。此外,你还应该定期清理旧的会话数据,以避免会话固定攻击和占用过多的服务器资源。这通常通过设置会话的过期时间和定期清理会话存储来实现。

              十、相关链接

              1. php官网
              2. php_Github
              3. PHP实现Token
              4. 「PHP系列」PHP简介与起步
              5. 「PHP系列」PHP语法介绍
              6. 「PHP系列」PHP变量
              7. 「PHP系列」PHP echo/print语句、数据类型详解
              8. 「PHP系列」PHP 常量/字符串、类型比较
              9. 「PHP系列」PHP 运算符详解
              10. 「PHP系列」If…Else语句/switch语句
              11. 「PHP系列」数组详解
              12. 「PHP系列」PHP数组排序及运用场景
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]