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

时间:2010-12-20 11:21:20

标签: php class variables methods

我的班级以外有一个全局变量= $ 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;

7 个答案:

答案 0 :(得分:49)

你可能真的想要这样做,因为这将是调试的噩梦,但似乎有可能。关键是您在构造函数中通过 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上的维基百科文章;基本上,理想情况下,您的对象应该管理自己的数据以及修改数据的方法;一般来说,公共财产,恕我直言,这是一个坏主意。

答案 1 :(得分:10)

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

class myClass() {
 private $myNumber;

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

现在你可以打电话了

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

答案 2 :(得分:6)

只需使用global keyword

e.g:

class myClass() {
    private function foo() {
        global $MyNumber;
        ...
然后, $ MyNumber将在该方法中变得可访问(并且实际上可修改)。

然而,使用全局变量通常是不受欢迎的(它们会散发出糟糕的代码气味),因此可能想要考虑使用单例类来存储这种性质的东西。 (然而,再一次,在不知道你想要实现的目标的情况下,这可能是一个非常糟糕的主意 - define可能会更有用。)

答案 3 :(得分:2)

使用构造函数怎么样?

class myClass {

   $myNumber = NULL;

   public function __construct() {
      global myNumber;

      $this->myNumber = &myNumber; 
   }

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

}

或者更好的方式(在inicializin对象时将全局变量作为参数传递 - 只读)

class myClass {

   $myNumber = NULL;

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

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

}
$instance = new myClass($myNumber);

答案 4 :(得分:2)

我所经历的是你无法直接将全局变量赋值给类变量。

class myClass() {

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

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

使用上面的代码,您会收到错误消息“ 解析错误:语法错误,意外'$ GLOBALS'

但如果我们这样做,

class myClass() {

    public $var = array();

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

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

}

我们的代码可以正常使用。

我们将一个全局变量赋给一个类变量必须在一个函数内部。我已经使用了构造函数。

因此,您可以使用 $ this-> var ;

在类的每个函数中访问您的全局变量

答案 5 :(得分:1)

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

private $classNumber = 8;

答案 6 :(得分:0)

类myClass {     受保护$ foo;

public function __construct(&$var)
{
    $this->foo = &$var;
}

public function foo()
{
    return ++$this->foo;
}

}