是的,你可以做这个功能。从这里开始,“全局变量”是指问题中提到的某种变量。
您可以使用类的静态变量来存储全局变量的值。
class Bla {
static private $x;
}
要访问此变量,我们可以使用几种方法:
制作特殊的 setter 和 getter,我建议这是最简单明了的方法:
class Bla {
static private $x = 'init value';
public function getX() {
return self::$x;
}
public function setX($value) {
self::$x = $value;
}
}
// Usage:
$obj1 = new Bla();
echo $obj1->getX();// init value
$obj1->setX('changed value');
当然,如果合适的话,您可以只使用静态访问语法(公共变量或静态 setter 和 getter),这比第一种方法更简单明了。例如:
class Bla {
static public $x = 'init value';
}
// Usage:
echo Bla::$x;
Bla::$x = 3;
还要记住,对象在 PHP5 中是通过引用传递的。
class Bla {
private $date;
public function __construct(DateTime $x) {
$this->date = $x;
}
public function getDate() {
return $this->date;
}
}
$date = new DateTime();
// Usage:
$obj1 = new Bla($date);
$obj2 = new Bla($date);
/* now play with $objN->getDate()->.. and $date->..
* to see, that $x in both objects are referring to same variable. */
现在让我们看看一些不太好的方法。
我们可以使用魔法 setter 和 getter,结合 phpDoc 可以“模拟”真实对象变量的行为(我的意思是在运行时它将获取和设置变量,在支持 phpDoc 的 IDE 中,您甚至可以在 auto-完成)。这种解决方案违反了封装原则,所以我不推荐它的常用用法。
/**
* @property mixed $x My global var.
*/
class Bla {
static private $x = 'init value';
public function __set($name, $value) {
if ($name == 'x') {
self::$x = $value;
}
}
public function __get($name) {
if ($name == 'x') {
return self::$x;
}
}
}
// Usage:
$obj1 = new Bla();
echo $obj1->x;// init value
$obj1->x = 'changed value';
没有魔法我们可以使用引用获得相同的行为:
class Bla {
static $storage = 'init value';
public $x;
public function __construct() {
$this->x = &self::$storage;
}
}
我们也可以在这里将 $x 设为私有并添加特殊的访问方法,这只有在您讨厌使用静态语法 (self::) 时才有意义。