【问题标题】:How to declare a global variable in php?如何在php中声明一个全局变量?
【发布时间】:2012-11-11 21:36:19
【问题描述】:

我有这样的代码:

<?
    $a="localhost";
    function body(){
        global $a;
        echo $a;
    }

    function head(){
        global $a;
        echo $a;
    }

    function footer(){
        global $a;
        echo $a;
    }
?>

有没有什么方法可以在一个地方定义全局变量并使变量$a 可以同时在所有函数中访问?不用global $a;更多?

【问题讨论】:

  • 不,没有。如果您不喜欢 global 关键字,请考虑在所有范围内使用 $GLOBALS['a'] 超全局,或考虑将参数传递给您的函数。
  • 如果它很重要,那么甚至可以使用会话变量。

标签: php global-variables global


【解决方案1】:

可以改用$GLOBALS 数组:

$GLOBALS['a'] = 'localhost';

function body(){

    echo $GLOBALS['a'];
}

来自Manual

一个关联数组,包含对当前在脚本全局范围内定义的所有变量的引用。变量名是数组的键。


如果您有一组需要一些公共变量的函数,那么具有属性的类可能是一个不错的选择,而不是全局:

class MyTest
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function head()
    {
        echo $this->a;
    }

    public function footer()
    {
        echo $this->a;
    }
}

$a = 'localhost';
$obj = new MyTest($a);

【讨论】:

    【解决方案2】:

    如果变量不会改变,你可以使用define

    例子:

    define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!');
    
    function footer()
    {
        echo FOOTER_CONTENT;
    }
    

    【讨论】:

    • 尝试修改FOOTER_CONTENT 时会发生什么?是像 Java 中的 final 还是 C、C++ 和 C# 中的 const
    • 如果你再次尝试定义 FOOTER_CONTENT,php 会抛出一个通知
    • 我需要在每次加载页面时计算当前的 unix 纪元时间,然后在几个计算(函数)中使用该值。 “定义”对我有用。最初,我没有看到“echo FOOTER_CONTENT;”没有前面的“$”,我得到了错误。
    • 如果变量不会改变它不是一个变量。不是吗?!
    • 也许在 2012 年,这是一个可以接受的答案,但在今天的 php 中使用define() 作为页脚内容并不是一个好的做法。
    【解决方案3】:

    如果变量在函数之外声明,则它已经在全局范围内。所以没有必要声明。但是从你调用这个变量的地方必须可以访问这个变量。如果您从函数内部调用,则必须使用 global 关键字:

    $variable = 5;
    
    function name()
    {
        global $variable;
        
        $value = $variable + 5;
        
        return $value;  
     
    }
    

    在函数外使用全局关键字不是错误。如果你想在函数中包含这个文件,你可以将变量声明为global

    // config.php
    
    global $variable;
    
    $variable = 5;
    

    // other.php
    
    function name()
    {
        require_once __DIR__ . '/config.php';
    }
    

    您也可以使用$GLOBALS。它是一个超全球的,因此它可以在任何地方访问。

    $GLOBALS['variable'] = 5;
    
    function name()
    {
        echo $GLOBALS['variable'];
    }
    

    根据您的选择,您可以选择其中任何一个。

    【讨论】:

      【解决方案4】:

      将变量添加到 $GLOBALS 超级全局数组中,例如

      $GLOBALS['variable'] = 'localhost'; 
      

      并在全球范围内使用它

      或者你可以使用在整个脚本中都可以访问的常量

      define('HOSTNAME', 'localhost');  
      

      【讨论】:

      • 如果你使用'define',一旦设置,你不能改变一个define!
      • 在你的第一个例子中,它是说'$变量现在在脚本后面被称为'localhost'?
      • 不,如果你想使用这个变量,你必须像 $GLOBALS['variable'];
      【解决方案5】:

      这个答案很晚,但我所做的是设置一个将布尔值、数组和整数初始值保存为全局范围静态变量的类。任何常量字符串都是这样定义的。

      define("myconstant", "value"); 
      
      class globalVars {
      
          static $a = false;
      
          static $b = 0;
      
          static $c = array('first' => 2, 'second' => 5);
      
      }
      
      
      function test($num) {
      
          if (!globalVars::$a) {
      
              $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.';
      
              globalVars::$a = true;
      
          } else {
      
              $returnVal = 'I forgot';
      
          }
      
          return $returnVal;
      
      }
      
      echo test(9); ---> The value of 9 + 0 + 5 is 14.
      
      echo "<br>";
      
      echo globalVars::$a; ----> 1
      

      static 关键字必须出现在类中,否则变量 $a、$b 和 $c 将不会在全局范围内。

      【讨论】:

      • 这是一个很好的解决方案,原因有很多。类 static 只需要在基本变量名称中添加几个字符:G::$Name,其中的声明如下所示: class G { static $Name, $Name2;} 注意 G 可以是真正的全局变量,然后 E 可以用于与雇员相关的变量。这比 PHP 支持的全面的面向对象范例更容易编程。如果确实需要常量,您可以在“const”之后声明它们,就像在“static”之后声明的变量一样——只需省略美元符号。 G::Example 是一个全局常量的例子。
      【解决方案6】:

      如果这符合您的意图,您可以在 Closure 函数或 Lambdas 中尝试关键字 use...不过 PHP 7.0。不是这样更好,而只是一种选择。

      $foo = "New";
      $closure = (function($bar) use ($foo) {
          echo "$foo $bar";
      })("York");
      

      demo | info

      【讨论】:

        【解决方案7】:

        您以编写问题的方式回答了这个问题 - 使用“定义”。但是一旦设置,您就无法更改定义。

        另外,在类中也有一些使用常量的技巧,例如您可以使用的 class::constant。您还可以通过向类声明静态属性来使它们可变,如果您想更改静态属性,还可以使用函数来设置它。

        【讨论】:

          【解决方案8】:

          您可以将全局变量声明为静态属性:

          class global {
              static $foo = "bar";
          }
          

          您可以在任何地方使用和修改它,例如:

          function echo_foo() {
              echo global::$foo;
          }
          

          【讨论】:

          • 这有点优雅。
          • 这个建议被低估了。
          【解决方案9】:

          如果您使用过程函数而不是变量并在任何地方调用它们会怎样。

          我通常会收集配置值并将它们放入带有 return 语句的函数中。我只是在我需要使用全局值并调用特定函数的地方包含了它。

          function host()
          {
             return "localhost";
          }
          

          【讨论】:

            【解决方案10】:

            $GLOBALS[] 正确的解决方案,但既然我们在谈论替代方案,函数也可以轻松完成这项工作:

            function capital() {
                return my_var() . ' is the capital of Italy';
            }
            
            function my_var() {
                return 'Rome';
            }
            

            【讨论】:

            • 这里的函数不是全局变量。
            • @PratikSoni 我从来没有说过它是一个全局变量。下次读得更好,这样你就不会到处传播负面评价了。
            • 如果您认为这具有误导性,我很抱歉。但我是在实际问题的背景下进行的。答案离问题一点也不近。 “如何在 php 中声明一个全局变量?”
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-30
            • 1970-01-01
            • 2011-03-22
            • 2011-02-12
            • 2019-09-11
            • 1970-01-01
            • 2011-06-22
            相关资源
            最近更新 更多