Php 如何使变量在整个类中成为全局变量

Php 如何使变量在整个类中成为全局变量,php,class,Php,Class,非常简单的问题,是否可以将从类外部检索的变量设置为“全局”到整个类,这样我就不必在每个方法的开头调用“全局$variable” 这就是我目前正在做的: class test{ public function testing(){ global $globalVariable, // Do something } public function testing_two(){ global $globalVariable,

非常简单的问题,是否可以将从类外部检索的变量设置为“全局”到整个类,这样我就不必在每个方法的开头调用“全局$variable”

这就是我目前正在做的:

class test{
    public function testing(){
        global $globalVariable,

        // Do something
    }
    public function testing_two(){
        global $globalVariable,

        // Do something
    }
}
换句话说,我是否可以将变量导入构造函数,从而使整个类都可以访问它们,而不必为每个方法调用“全局”?

更新

我不确定我是否把我想要实现的目标说得太清楚了。请参阅下文:

$globalVariable = 'hello';

class test{
    public function testing(){
        global $globalVariable,

        // Do something
    }
    public function testing_two(){
        global $globalVariable,

        // Do something
    }
}

将该变量作为类的属性传递

class test
{
    private $globalVariable = '';

    public function testing()
    {
        $this->globalVariable = 'set-som-value';
    }

    public function testing_two()
    {
        $this->globalVariable = 'Do Extra Work';
    }
}
您可以使用单词privatepublicprotected更改变量可见性,其中private使变量只能在该类中访问,protected使变量在扩展该特定类的类中可用,public使得变量可以从任何地方访问

全球课外活动

global $globalVar;
$globalVar = 'SomeVal';

class test
{
    public function testing()
    {
        global $globalVar;
    }
}
只需使用参考:

class test{
    private $myvar;

    //use __ or old syntax to your liking
    function test() {
        global $globalVariable;
        $myvar =& $globalVariable;
    }

    public function testing(){
        //Use $this->myvar

        // Do something
    }
    public function testing_two(){
        //USe $this->myvar

        // Do something
    }
}

要明确如何做,请执行以下操作:

你很可能想做这样的事情
include('database.php')。此时,脚本中包含的所有内容都是全局的。现在,如果您有一个如上所述的类,则添加一个构造函数:

class testclass
{
    private $db;

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

    public function yourmethod()
    {
       $this->db->prepare(); // And so on
    }
}

假设您的全局变量在全局范围内称为$db。您现在可以使用
newtestclass($db)构建您的对象。现在在所有方法中使用
$this->db
时,无需使用全局语句。

这可能会有所帮助。我在我的类之外有一个用于mysqli的var

             <?php
             $DB_NAME = 'database';
             $DB_HOST = 'host';
             $DB_USER = 'user';
             $DB_PASS = 'password';

             $linkID = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);

             if (mysqli_connect_errno()) {
                  printf("Connect failed: %s\n", mysqli_connect_error());
                  exit();
             }


             $Test = new Test($linkID);


                 class Test {

                     public $linkID;

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

                     public function new_mysql($sql) {
                         $result = $this->linkID->query($sql) or die($this->linkID->error.__LINE__);
                         return $result;
                     }

                     public function do_query() {
                         $sql = "SELECT `name` FROM `contacts`";
                         $result = $this->new_mysql($sql);
                         while ($row = $result->fetch_assoc()) {
                             print "Test $row[name]<br>";
                         }
                      }
                 }

         ?>


现在,数据库详细信息作为助手传递给类。希望这能有所帮助。

只需将其作为参数传递给构造函数,并将其分配给私有属性。@FelixKling如果需要一个真正的全局变量,即在类外更改变量,则此操作将被中断。我想到了全局数据库连接资源。@Eugen:无论如何,全局变量是一个糟糕的设计决策。如果代码增长,维护和重构就会变得更加困难。@Ben:为什么它们是全局的?是否在脚本运行时更改数据库连接?为什么不将其作为参数传递给构造函数(依赖项注入)。有许多设计模式可以避免全局变量(这是一个很好的理由)。@BenCarey:你大错特错了。继续这样做,你会学到很难的方法。推荐信是不推荐的,不是吗?@BenCarey:绝对不是。然而,你试图达到的目标看起来显然是错误的,你应该修改你想做的事情,因为一定有更好的东西。@Ben:不,没有。在调用时传递引用是不受欢迎的:我想,如果这个特性消失的话,这个结论仍然是不可能的:我个人认为它是语言的一个重要组成部分,删除它将是一个令人尴尬的举动。其他人可能同意或不同意。(谈论推荐人,而不是传递推荐人!)啊,我的印象是,道歉。我很确定这个答案正是我想要的。但是,我是否可以忘记引用并在构造中调用'global$globalVariable',然后在方法周围使用$globalVariable?谢谢你的建议,但我没有详细解释我试图实现的目标。“$globalVariable”是在类之外定义的,因此上述答案不相关。对不起,是我的错。再说一次,这不是我想要的。我不想为每个方法调用“全局”。我希望整个类都能访问该变量。见@dan的回答谢谢!!这正是我想要的,我想要的只是确认。出于兴趣,参考的好处(点)是什么?上述方法有几个好处。首先,它使代码更清晰。从您的文档中检查该类的每个人现在都看到该类依赖于传递给它的数据库对象。此外,您可以为连接定义接口,并将不同类型的连接传递到类中,只要它们实现了接口。如果您想在以后测试代码,这也会有所帮助。这样,您就可以简单地交换对象。总的来说,监督每一件事要好得多,因为你不依赖于你在课堂上所需要的全球状态。