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类:全局变量作为类中的属性的主要内容,如果未能解决你的问题,请参考以下文章
python 中关于 类变量, 实例变量, 静态方法,类方法,全局变量,局部变量的理解