PHP类:全局变量作为类中的属性

Posted

技术标签:

【中文标题】PHP类:全局变量作为类中的属性【英文标题】:PHP class: Global variable as property in class 【发布时间】:2011-05-28 05:03:11 【问题描述】:

我的 class= $MyNumber; 之外有一个全局变量

如何在 myClass 中将其声明为属性? 对于我班级中的每个方法,我都是这样做的:

class myClass() 

    private function foo() 
         $privateNumber = $GLOBALS['MyNumber'];
    


我想要这个

class myClass() 

    //What goes here?
    var $classNumber = ???//the global $MyNumber;

    private function foo() 
         $privateNumber = $this->classNumber;
    


编辑:我想根据全局 $MyNumber 创建一个变量,但是 在方法中使用之前进行了修改

类似:var $classNumber = global $MyNumber + 100;

【问题讨论】:

更重要的问题是:你为什么需要它?这里可能存在设计错误。 @elusie:我想在我的课程中以不同的方式引用 $MyNumber 为什么首先需要一个全局变量?大多数情况下不需要它们。那个全局变量是干什么用的? php 没有指针。它确实有引用,有时像指针一样工作,但它们不是。不要试图模拟指针功能;你只会给未来带来巨大的痛苦——你试图调试它。 【参考方案1】:

只需使用global keyword。

例如:

class myClass() 
    private function foo() 
        global $MyNumber;
        ...

$MyNumber 然后将在该方法中变得可访问(并且实际上是可修改的)。

但是,全局变量的使用通常会受到反对(它们会散发出难闻的代码味道),因此您可能想要考虑使用单例类来存储这种性质的任何内容。 (再说一次,如果不知道更多关于你想要实现的目标,这可能是一个非常糟糕的主意 - define 可能会更有用。)

【讨论】:

【参考方案2】:

如果你想从一个类中访问一个属性,你应该:

private $classNumber = 8;

【讨论】:

【参考方案3】:

尽量避免使用全局变量,而是可以使用类似的东西

class myClass() 
 private $myNumber;

 public function setNumber($number) 
  $this->myNumber = $number;
 

现在你可以打电话了

$class = new myClass();
$class->setNumber('1234');

【讨论】:

【参考方案4】:

使用构造函数呢?

class myClass 

   $myNumber = NULL;

   public function __construct() 
      global myNumber;

      $this->myNumber = &myNumber; 
   

   public function foo() 
      echo $this->myNumber;
   


或者这样更好(在初始化对象时将全局变量作为参数传递 - 只读)

class myClass 

   $myNumber = NULL;

   public function __construct($myNumber) 
      $this->myNumber = $myNumber; 
   

   public function foo() 
      echo $this->myNumber;
   


$instance = new myClass($myNumber);

【讨论】:

【参考方案5】:

您可能真的想要这样做,因为这将是调试的一场噩梦,但它似乎是可能的。关键是您在构造函数中通过 reference 分配的部分。

$GLOBALS = array(
    'MyNumber' => 1
);

class Foo 
    protected $glob;

    public function __construct() 
        global $GLOBALS;
        $this->glob =& $GLOBALS;
    

    public function getGlob() 
        return $this->glob['MyNumber'];
    


$f = new Foo;

echo $f->getGlob() . "\n";
$GLOBALS['MyNumber'] = 2;
echo $f->getGlob() . "\n";

输出将是

1
2

这表明它是通过引用而不是值分配的。

正如我所说,调试将是一场噩梦,所以你真的不应该这样做。阅读encapsulation 上的***文章;基本上,您的对象应该理想地管理自己的数据以及修改该数据的方法;恕我直言,即使是公共财产通常也是个坏主意。

【讨论】:

谢谢。是的,调试起来可能是一场噩梦。但是如果不想在类中的每个方法中为变量编写 global 关键字,并且仍然希望它代表原始的全局变量(以防它的状态在类外发生变化),这个解决方案看起来不错。谢谢! 是的,它会起作用,但如果可能的话,最好避免使用全局变量。 当然可以,但是如果它们是唯一的和静态的,它对于设置全局配置变量很有用,而不必像 mrwooster 的示例那样显式调用方法。例如,URI、访问令牌、密码等,在应用程序中将被使用。基本上,除非您知道数据是动态的,否则以这种方式“手动”调用方法来初始化变量是多余的。 或者更好的是,根本没有全局(在 PHP 意义上)配置变量。为您的配置注入某种容器并将其传递到需要它的地方。【参考方案6】:

我的经验是不能直接将全局变量赋值给类变量。

class myClass() 

    public $var = $GLOBALS['variable'];

    public function func() 
         var_dump($this->var);
    

使用上面的代码,您会收到一条错误消息“Parse error: syntax error, unexpected '$GLOBALS'

但如果我们这样做,

class myClass() 

    public $var = array();

    public function __construct() 
        $this->var = $GLOBALS['variable'];
    

    public function func() 
         var_dump($this->var);
    


我们的代码可以正常工作。

我们将全局变量分配给类变量的位置必须在函数内部。我为此使用了构造函数。

因此,您可以在类的每个函数中访问您的全局变量,只需使用 $this->var;

【讨论】:

【参考方案7】:
class myClass 

protected $foo;

public function __construct(&$var)

    $this->foo = &$var;


public function foo()

    return ++$this->foo;


【讨论】:

请使用正确的格式,不要只发布代码,详细说明您的答案。

以上是关于PHP类:全局变量作为类中的属性的主要内容,如果未能解决你的问题,请参考以下文章

C#基础——全局静态类中的静态类变量的设置

python 中关于 类变量, 实例变量, 静态方法,类方法,全局变量,局部变量的理解

类中的 PHP 全局变量范围

python中的类中属性元素加self.和不加self.的区别

Php 类中如何调用类外的变量

java的静态内部类中定义的变量是全局的么?