在我的类中使用全局变量导致意外语法

时间:2015-11-10 02:42:56

标签: php scope

我有一个类需要一个在其范围之外定义的变量。所以我尝试使用global但是,这会导致此错误:

  

语法错误,意外'全球' (T_GLOBAL),期待函数(T_FUNCTION)

我不确定我是否将它放在错误的位置或错误地使用了全局关键字。

我的代码如下所示:

$data = new testClass();

class System
{
    private $values;
    global $data;

    public function __construct()
    {

    }
    public function test()
    {           
        return $data->get();
    }
}
$system = new System();
echo $system->test();

所以我想知道如何在我的班级中定义$data变量?我对全局的使用似乎是不正确的,我还将全局声明放在__contrust()函数中,但这也没有用。

4 个答案:

答案 0 :(得分:3)

在函数中定义全局变量而不是类:

class System
    {
        private $values;
        private $thedata;

    public function __construct($data)
    {
        $this->thedata = $data;
    }
    public function test()
    {           
        return $this->thedata->get();
    }
}

$data = new testClass();
$system = new System($data);
echo $system->test();

编辑:替代想法:

timer = new Timer();
this.timer.Interval = 60000;
if(DateTime.Now.TimeOfDay >= System.TimeSpan.Parse("03:00:00") && DateTime.Now.TimeOfDay <= System.TimeSpan.Parse("03:30:00")) { //do something }

答案 1 :(得分:2)

  

所以我想知道如何在我的班级中定义$ data变量?我对全局的使用似乎是不正确的,我还将全局声明放在__contrust()函数中,但这也没有用。

如果你真的想使用糟糕的global构造,你应该这样做:

class System
{
    private $values;
    // removed global from here


    public function __construct()
    {

    }
    public function test()
    {
       // added global here
       global $data;
        return $data->get();
    }
}

但是OOP原则建议我们使用组合,而不是全局变量。所以你可以通过构造函数或setter将$data传递给你的另一个类。以下是实现这两种方法的一些代码:

class testClass {
    public function get()
    {
        echo __CLASS__.'::'.__FUNCTION__;
    }
}

class System
{
    private $values;
    private $data;

    public function __construct(testClass $data = null)
    {
        if ($data) {
            $this->data = $data;
        }
    }

    public function setData(testClass $data)
    {
        $this->data = $data;
    }

    public function test()
    {
        return $this->data->get();
    }
}

$data = new testClass();
// via constructor
$system = new System($data);
// or via setter
$system = new System;
$system->setData($data);
echo $system->test();

答案 2 :(得分:0)

您可以在实例化类时传递$data,然后在构造函数中分配它,这将使其可用于该类的所有方法。

class System {

    public $data;

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

    public function index() {
        echo $this->data;
    }

}


$data = 'foo';

$system = new System($data);

echo $system->index();

输出&#39; foo&#39;;

答案 3 :(得分:-1)

第一件事……这可能只是一个简单的“不良PHP语法”问题。寻找被遗忘的;或者就我而言...忘记了功能实际上需要单词 function :)