【问题标题】:make variable available to all classes, methods, functions and includes, just like $_POST使变量可用于所有类、方法、函数和包含,就像 $_POST
【发布时间】:2013-03-04 21:47:43
【问题描述】:

这个问题看起来很简单,但我在任何地方都找不到答案......

在我的 php 脚本/文件的开头,我想创建一个变量。

$variable = 'this is my variable';

我希望这个变量在整个脚本中都可用,以便所有类、方法、函数、包含的脚本等都可以简单地将这个变量称为 $variable。

Class MyClass
{
  public function showvariable()
  {
     echo $variable;
  }
}

$_SESSION、$_POST、$_GET 变量的行为都是这样的。我可以只写一个方法并使用 $_POST 就可以了。但是,如果我使用在脚本开头定义的 $variable,它会显示“注意:未定义的变量:变量在 ...”,当我编写函数而不是类方法时,它甚至会这样说。 .

我试着写

global $variable = 'this is my variable';

但是脚本无法加载... “HTTP 错误 500(内部服务器错误):服务器尝试完成请求时遇到了意外情况。”

如何使变量像 $_POST 这样真正全局可访问?

我为什么需要这个?我特别计划将其用作表单令牌。在页面顶部,我将表单令牌生成为 $token,在页面底部,我将其存储在会话中。在处理任何表单之前,我会检查 SESSION 令牌是否与 POST 令牌匹配......而且由于我经常在页面上有多个表单(顶部导航中的登录表单,主体中的注册表单)我只是想让它方便并且在每个表单上调用 $token。有时我的表单元素是由类或函数生成的,但它们无法识别变量并说它没有定义。

【问题讨论】:

  • “但是脚本无法加载...”是什么意思
  • 这真的取决于上下文。在什么情况下需要全局值?
  • 你在破坏 oop 的封装。
  • 不要使用全局变量。它们使代码难以测试和调试。没有它们,你可以完成你想做的事情。

标签: php oop scope


【解决方案1】:

我找到了... -.- 我认为这很容易...

我必须通过使用来调用变量

$GLOBALS['variable'];

刚刚找到...终于... http://php.net/manual/en/reserved.variables.globals.php

编辑大约 8 个月后:

我刚刚了解了 CONSTANTS!

define('name', 'value');

他们只是不能被重新分配...... 我想我也可以使用它! http://www.php.net/manual/en/language.constants.php

【讨论】:

  • 奇怪,但这对我不起作用,而我正在尝试对脚本中的所有函数使用某种常量。
  • 请注意,对于大型代码库,不建议使用全局变量,因为它们很难单独测试程序的各个部分。相反,如果您没有全局变量并使用依赖注入,则测试程序的一小部分变得容易。
  • @ButtleButkus 你将如何使用依赖注入轻松地让 $username 这样的变量随处可用?
  • @garek007 它不需要随处可用。谷歌“编码中的关注点分离”。使用 OOP,您可能有一个包含 $username 的“用户”对象,并将该对象注入到您的“页面”对象或类似的东西中。然后使用'$user->getUsername()' 将页面上的用户名显示给用户,例如。
  • @ButtleButkus 我明白了。我熟悉关注点分离,但依赖注入对我来说仍然很困难。我已经看到它按照您在框架中描述的方式完成了。这真的是我所追求的。我认为在 Symfony 中它似乎“始终存在”,但我只是不确定它是如何完成的。我可能需要创建一个用户类,因为目前我没有。
【解决方案2】:

只需在任何类或函数之外定义一个变量。然后在任何类或函数中使用关键字global

<?php

// start of code

$my_var = 'Hellow Orld';

function myfunc() {
  global $my_var;
  echo $my_var; // echoes 'Hellow Orld';
}

function myOtherFunc() {
  var $my_var;
  echo $my_var; // echoes nothing, because $my_var is an undefined local variable.
}


class myClass {

  public function myFunc() {
    global $my_var;
    echo $my_var; // echoes 'Hellow Orld';
  }

  public function myOtherFunc() {
    var $my_var;
    echo $my_var; // echoes nothing.
  }

}

myFunc(); // "Hellow Orld"
myOtherFunc(); // no output
myClass->myFunc(); // "Hellow Orld"
myClass->myOtherFunc(); // no output

// end of file
?>

【讨论】:

    【解决方案3】:

    在 PHP 中,全局变量必须在每个将要使用它们的函数中声明。见:PHP Manual, section on variable scope

    话虽如此,全局变量通常不是一个好主意,而且在大多数情况下有办法避免使用它们。

    【讨论】:

    • 感谢您的回答。我也找到了这篇文章,但它指的是在函数或类中处理或创建变量之后如何访问变量。我的问题是,我想访问函数或类中的变量,并且在声明该函数之前已经声明了该变量。
    【解决方案4】:

    您需要声明全局才能在任何函数范围内访问它:

    在脚本的顶部:

    global $var;
    $var= "this is my variable";
    

    在你的班级

    ...
    public function showvariable(){
        global $var;
        echo $var;
    }
    ...
    

    【讨论】:

    • 感谢您的回答!虽然这非常有效,但我正在寻找一种更方便的方法,每次编写函数时我都不必提及这个变量......我只是希望它在那里,如果我需要它就调用它,甚至从不提及它,如果我不需要它。
    • 全局变量在 PHP 中的工作方式(除非您要使用 $GLOBALS),您需要提及它。不用的话不用提,就这么简单。
    猜你喜欢
    • 2021-08-19
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多