【问题标题】:Access Global Variables within a Static Method in PHP在 PHP 中的静态方法中访问全局变量
【发布时间】:2014-08-29 21:37:04
【问题描述】:

我有一些与此类似的 php 代码:

$var1 = 'Variable 1';
$var2 = 'Variable 2';

class myClass {

    function __construct() {
        $this->var1 = $GLOBALS['var1'];
        $this->var2 = $GLOBALS['var2'];
    }

    public function returnVars() {
        return $this->var1 . ' ' . $this->var2; //Works fine
    }

    public static function returnVars2() {
        //What should I do here?
    }

}

如果我使用$myClass = new myClass() 实例化这个类,我可以使用returnVars() 方法或者只是从类中获取var1var2 就好了。我的问题是我需要在静态方法returnVars2() 中使用全局变量$var1$var2。我不能使用这个$this 关键字,因为该类没有被实例化(并且它们在构造函数中被声明),但我仍然无法正常访问全局变量。

非常感谢任何建议!

【问题讨论】:

  • 您是否尝试过使用global 关键字?
  • 和你在构造函数中做的一模一样?顺便说一句,您不应该使用全局变量,只需将您需要的参数发送给方法。或者您的意思是使用常量而不是变量?
  • 这段代码在架构方面非常糟糕
  • 在静态方法中访问全局变量的方式与在任何其他函数中访问全局变量的方式完全相同。通过使用$GLOBALS 或使用global 声明。有什么问题?

标签: php


【解决方案1】:

将变量声明为静态成员:

class foo {
    public static $var1;
    public static $var2;

    function __construct() {
       foo::$var1 = $GLOBALS['var1'];
       foo::$var2 = $GLOBALS['var2'];
    }
}

然后您可以在该类中的任何方法中以foo::$varX 的身份访问它们,无论是否为静态。

【讨论】:

  • self::$var1 更好,因为当他决定更改类名时,他必须在各处重写所有foo::$var1。违反 DRY 原则,因此 +0
  • 这取决于一个对象在使用静态方法之前至少被实例化一次,否则变量将不会被初始化。
  • @jeroen:确实如此,但没有其他方法可以做到。不能在属性定义中这样做,因为那将是一个表达式并且无法在编译时解析。
  • 您可以在returnVars2函数中实例化一个对象,以确保构造函数已经运行。
  • @barmar:这可能行得通。从未尝试在对象自己的构造函数中实例化“自我”对象。不知何故,似乎是食人动物。
【解决方案2】:

或者更简单的解决方案:

$mydataExample=array(1,2,3,4,5,6,7);

function myDataFunction() {
  global $mydataExample;
  return $mydataExample;
}

然后我们可以在public static function中使用这个数组:

public static function example() {
 $data = myDataFunction();
 print_r($data);
}

【讨论】:

    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 2011-01-17
    • 2014-07-29
    • 1970-01-01
    • 2017-01-13
    • 2016-11-12
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多