概述

全局变量是在函数或类外部定义的变量,可以从 PHP 脚本中的任何位置访问。它们具有全局作用域,这意味着脚本中的任何函数或类都可以访问和修改它们。全局变量通常用于存储在整个脚本执行过程中需要访问和更新的数据,例如配置设置、用户输入数据或数据库连接。但是,应限制全局变量的使用,以防止脚本的不同部分意外修改其值。此外,全局变量可能会导致代码的可读性和可维护性出现问题,尤其是在大型项目中。通常建议使用更结构化的数据存储方法,例如将变量作为参数传递或使用类和对象。

什么是 PHP 全局变量?

在 PHP 中,全局变量是可从脚本中的任何位置访问的变量,包括函数、类和其他结构内部。全局变量使用关键字“global”后跟变量名称进行定义,它们通常在任何函数或类之外声明。当变量声明为全局变量时,它可以在整个代码库中使用,并且对变量所做的任何更改都将反映在使用该变量的脚本的所有区域中。

全局变量可用于存储需要从代码库中的多个位置访问的信息。例如,您可以使用全局变量来存储当前用户的 ID 或需要由各种函数或类访问的配置设置。通过将此信息存储在全局变量中,可以避免将信息作为函数参数传递,这可能会很麻烦并导致代码臃肿。

但是,谨慎使用全局变量非常重要,因为过度使用会导致代码难以维护和调试。使用全局变量时,可能更难隔离特定代码块的影响,并且测试代码可能更难。此外,如果有多个开发人员在一个项目上工作,则全局变量可能会导致冲突,并使跟踪错误变得更加困难。

为了避免其中的一些问题,可以考虑使用依赖关系注入模式,而不是依赖于全局变量。在此模式中,将变量作为参数传递给函数或类,而不是依赖于全局变量。这样可以更轻松地隔离特定代码块的影响,还可以使代码更具可测试性。

使用全局变量时要记住的另一件事是命名冲突。如果有多个同名的全局变量,则可能很难跟踪哪个变量在哪个上下文中使用。若要避免此问题,最好使用不太可能与代码库中的其他变量冲突的描述性变量名称。

语法

让我们看看如何在 php 中声明全局变量的语法:

 
global $variable_name;

解释

在此语法中,“global”是一个关键字,它告诉 PHP 使变量全局可用,而“$variable_name”是要使变量全局可用的变量的名称。在编辑器中运行上述语法以获得更好、更清晰的解释。

若要在函数或类方法中使用全局变量,必须首先使用上述语法将变量声明为全局变量。这告诉 PHP 在全局作用域中查找变量,而不是在局部作用域中创建同名的新变量。

需要注意的是,过度使用全局变量会导致代码难以维护和调试,如上一个答案所述。因此,通常建议限制全局变量的使用,而是使用其他技术(如依赖注入)在函数和类之间传递变量。

如何在PHP中声明全局变量?

在 PHP 中声明全局变量是一个简单的过程。为了将变量声明为全局变量,必须使用“global”关键字后跟变量名称。

下面是如何在 PHP 中声明全局变量的示例:

 
// Declare a global variable called $my_global_variable
global $my_global_variable;

// Set the value of the global variable
$my_global_variable = "Hello, world!";

在此示例中,我们使用“global”关键字声明一个名为“my_global_variable”的全局变量。然后,我们将全局变量的值设置为“Hello, world!”。

需要注意的是,全局变量可以从 PHP 代码中的任何位置访问,包括函数、类和其他结构。但是,过度使用全局变量会导致代码难以维护和调试。通常建议限制全局变量的使用,而是使用其他技术(如依赖注入)在函数和类之间传递变量。

下面是如何在函数中使用全局变量的示例:

 
// Declare a global variable called $my_global_variable
global $my_global_variable;

// Set the value of the global variable
$my_global_variable = "Hello, world!";

// Define a function that uses the global variable
function my_function() {
    global $my_global_variable;
    echo $my_global_variable;
}

// Call the function
my_function();

解释

在此示例中,我们首先使用“global”关键字声明全局变量“my_global_variable”,并将其值设置为“Hello, world!”。然后,我们定义一个名为“my_function”的函数,该函数使用“global”关键字访问全局变量并使用“echo”语句打印其值。最后,我们调用“my_function”函数,它输出“Hello, world!”,因为它正在访问我们之前声明的全局变量的值。在编辑器中运行上述代码以获得更好、更清晰的解释。

在 PHP 中声明全局变量是一个简单的过程,涉及使用“global”关键字后跟变量名称。但是,请务必明智地使用全局变量,以避免代码可维护性、可测试性和命名冲突问题。使用全局变量时,请务必注意潜在的缺点,并在适当的情况下考虑依赖注入等替代模式。

例子

示例 1:修改函数内的全局变量

 
$global_variable = "Hello, world!";

function modify_global_variable() {
    global $global_variable;
    $global_variable = "Goodbye, world!";
}

echo $global_variable . "<br>"; 

modify_global_variable();

echo $global_variable; 

解释

在此示例中,我们声明一个名为“global_variable”的全局变量,并将其值设置为“Hello, world!”。然后,我们定义一个名为“modify_global_variable”的函数,该函数使用“global”关键字访问全局变量并将其值更改为“Goodbye, world!”。最后,我们调用“modify_global_variable”函数,并在函数调用前后打印全局变量的值。此代码的输出是“Hello, world!”,后跟“Goodbye, world!”,因为全局变量在函数内部被修改。在编辑器中运行上述代码以获得更好、更清晰的解释。

示例 2:在类中使用全局变量

 
class MyClass {

    public function my_method() {
        global $global_variable;
        echo $global_variable;
    }
}

$global_variable = "Hello, world!";
$obj = new MyClass();
$obj->my_method(); 

解释

在此示例中,我们使用一个名为“my_method”的方法定义一个名为“MyClass”的类,该方法使用“global”关键字访问名为“global_variable”的全局变量,并使用“echo”语句打印其值。然后,我们将全局变量的值设置为“Hello, world!”,并创建一个 MyClass 对象的实例。最后,我们在 MyClass 对象上调用“my_method”方法,该方法输出“Hello, world!”,因为它正在访问我们之前声明的全局变量的值。在编辑器中运行上述代码以获得更好、更清晰的解释。

示例 3:在递归函数中使用全局变量

 
$global_variable = 0;

function my_recursive_function($n) {
    global $global_variable;
    if ($n == 0) {
        return;
    } else {
        $global_variable++;
        my_recursive_function($n - 1);
    }
}

my_recursive_function(5);
echo $global_variable; 

解释

在此示例中,我们声明一个名为“global_variable”的全局变量,初始值为 0。然后,我们定义一个名为“my_recursive_function”的递归函数,该函数采用参数$n。该函数检查 $n 是否为 0,如果是,则返回。否则,它使用“++”运算符递增全局变量的值,然后以 $n - 1 作为参数递归调用自身。最后,我们调用 $n = 5 的“my_recursive_function”函数并打印全局变量的值,该值应为 5,因为该函数被递归调用了 5 次。 在递归函数中使用全局变量是跨多个递归级别保持状态的有用方法。在编辑器中运行上述代码以获得更好、更清晰的解释。

示例 4:跨多个文件使用全局变量

file1.php:

 
<?php
$global_variable = "Hello, world!";

file2.php:

 
<?php
include "file1.php";
echo $global_variable; 

解释

在此示例中,我们有两个 PHP 文件:file1.php 和 file2.php。在file1.php中,我们声明一个名为“global_variable”的全局变量,并将其值设置为“Hello, world!”。在file2.php中,我们使用 “include” 语句包含file1.php,并使用相同的名称访问全局变量的值。由于全局变量是在 file1.php 中声明并包含在 file2.php 中,因此我们可以在两个文件中访问其值。此代码的输出是“Hello, world!”,因为我们正在跨多个文件访问全局变量的值。在编辑器中运行上述代码以获得更好、更清晰的解释。

值得注意的是,跨多个文件使用全局变量可能会使跟踪变量的使用和修改位置变得更加困难,因此请务必谨慎使用此模式,避免产生命名冲突或意外的副作用。

结论

  • 全局变量是一个变量,可以从 PHP 脚本中的任何位置访问和修改,包括函数内部和多个文件。
  • 若要将变量声明为全局变量,必须在要使用它的函数或代码块中使用“global”关键字,后跟变量名称。
  • 谨慎使用全局变量非常重要,因为它们会使跟踪变量的使用和修改位置变得更加困难,并可能导致命名冲突或意外的副作用。
  • 全局变量可用于存储和跟踪跨多个函数或递归级别的状态,但通常应避免使用全局变量,以便将变量作为函数参数传递或尽可能使用其他变量范围技术。
  • 最好在 PHP 脚本的开头或单独的文件中定义所有全局变量,以便于查找和管理它们。
  • 避免全局变量的另一种方法是使用面向对象的编程原则(如封装和依赖注入)来管理数据并在对象之间传递数据。
  • 总之,全局变量在某些情况下可能很有用,但应谨慎使用,以避免潜在问题并使代码更具可维护性和可伸缩性。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐