【问题标题】:Globals variable in class类中的全局变量
【发布时间】:2015-03-09 11:34:03
【问题描述】:

我正在尝试将 Globals 变量放入该类的另一个变量中。但它不起作用。显示错误日志

语法错误,意外的 T_VARIABLE

class data{
    public $datav = $GLOBALS['dat'];

    public static function get(){
           return self::$datav;
    }

}

我也尝试替换self::$datav;与$this->datav;但它也给出了同样的错误。

我也想知道有什么方法可以使用类外的变量。 例如:

$datav = array{'name'=>'assadf','asdf'=>'asddf'}
 class data{

        public static function get(){
               return $datav['name'];
        }

    }

【问题讨论】:

    标签: php arrays class oop


    【解决方案1】:

    在类中使用这样的全局变量会破坏类的封装。

    最好通过__construct($var) 传递类似的值。但是由于您有一个定义为静态的函数,我假设您想让这个类成为静态的,因此不会为静态类调用 __construct()

    所以你必须像这样创建一个 setter 方法:-

    class data{
        public $datav = NULL;
    
        public static function set($var) {
            $this->datav = $var;
        }
    
        public static function get(){
               return $this->$datav;
        }
    
    }
    

    然后像这样称呼你的班级

    data::set($GLOBALS['dat']);
    
    $localVar = data::get();
    

    【讨论】:

    • OP 打算在他们的类中保留$GLOBALS,即类型array。我认为 $datav 应该是 arrayset 应该有 2 个参数 - keyvalue
    • 相当无关紧要,它在一个类中使用全局变量是这里的大问题。
    • 更改了::set 以更好地适应问题
    【解决方案2】:

    必须为类属性分配一个常量值。此外,$datav 必须是静态的,才能从 get 方法访问。

    class data{
        public static $datav;
    
        public static function get(){
            if(!isset(self::$datav)) {
                self::$datav = $GLOBALS['dat'];
            }
            return self::$datav;
        }
    }
    

    对于第二个代码,你可以使用global关键字告诉PHP你使用的变量来自外部作用域,而不是函数作用域:

    $datav = array('name'=>'assadf','asdf'=>'asddf');
    class data{
        public static function get(){
            global $datav;
            return $datav['name'];
        }
    }
    

    【讨论】:

    • 这仍然在类中使用 $GLOBALS,这是不好的做法,并且完全破坏了封装。
    • @RiggsFolly 是的,但在某些情况下,这可能是最简单的解决方案。由提问者决定哪个答案更适合他。我已经解决了句法问题,你已经解决了语义问题。这两种解决方案都对其他人有所帮助,并且您已经在回答中声明不应破坏封装。
    • Easiest !== Correct 在几乎所有情况下。坚持不是我的职责,也不是我带领人们进入不良实践的职责。谁知道呢,在未来的某个日期我可能会参与修复/增强此代码的可能性。如果里面没有明显的垃圾就好了。
    【解决方案3】:

    你应该使用global 让 PHP 知道这是一个在类外部声明的全局变量。

    $datav = "something";
    
    class Data {
    
        public static function get(){
               global $datav;
               return $datav;
        }
    
    }
    

    【讨论】:

    • 不鼓励使用global,因为它依赖于内存中的变量并保存您希望它保存的值 - 这很容易被覆盖。如果需要通过整个类或设置类属性的方法,则应将变量注入构造函数中。
    • 在静态类中使用构造函数不会被调用。相反,他应该使用二传手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2016-10-06
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多