【问题标题】:Using global variable in my class causing unexpected syntax在我的班级中使用全局变量导致意外的语法
【发布时间】:2015-11-10 02:42:56
【问题描述】:

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

语法错误,意外的“全局”(T_GLOBAL),期望函数(T_FUNCTION)

我不确定是我放错了地方还是使用了 global 关键字不正确。

我的代码如下所示:

$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 变量?我对 global 的使用似乎不正确,我也将 global 声明放在了 __contrust() 函数中,但这也不起作用。

【问题讨论】:

    标签: php scope


    【解决方案1】:

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

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

    编辑:替代想法:

    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();
    

    【讨论】:

    • 所以我必须在每个使用它的函数中调用 global 而不仅仅是将它设置在整个类的顶部?
    • 是的,但我会更新我的答案以包含一个替代选项,该选项可能适用于您的情况,也可能不适用(但如果您可以使其工作,那么代码标准会更好,所以您不必在每个函数中声明全局变量)。
    【解决方案2】:

    所以我想知道如何在我的类中定义 $data 变量?我对 global 的使用似乎不正确,我也将 global 声明放在了 __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();
    

    【讨论】:

      【解决方案3】:

      您可以在实例化类时传递$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();
      

      输出'foo';

      【讨论】:

        【解决方案4】:

        首先要做的事情...这可能只是一个简单的“错误的 PHP 语法”问题。寻找遗忘;或者在我的情况下......忘记函数实际上需要这个词 function :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-26
          • 1970-01-01
          • 1970-01-01
          • 2015-07-18
          • 1970-01-01
          • 2020-01-14
          • 1970-01-01
          • 2021-11-15
          相关资源
          最近更新 更多