PHP单例和扩展静态属性的使用

时间:2013-01-06 13:18:20

标签: php class properties static singleton

这个问题,我已经在圈子里跑了几个小时了。 也许它根本不可能,或者可能有更好的OOP解决方案......

例如:我有两个班级

class Base
{
    public static $config;
}

class System extends Base
{
    public function __construct()
    {
        self::$config = 2;
    }
}

class Core extends Base
{
    public function __construct()
    {
        self::$config = 3;
    }
}

我总是以单例形式访问这些类:System :: HelloWorld(),Core :: DoStuff();

我希望$ Config属性继承自Base类,因为我需要它 几乎每一个班级,所以为什么每次都要一遍又一遍地定义它。

问题是,$ Config属性将其自身覆盖为sonn,因为另一个类为其设置了自己的值:

System::$config = 2;
Core::$config = 3;
print System::$config // it's 3 instead of 2

我明白为什么会发生这种情况:因为Base :: $ Config是静态的 - 就这样 - 与所有孩子共享。我不希望这样,我希望它在每个孩子身上都是静止的,而不是它的孩子们的低谷。如果我真的实例化System和Core类,那就没问题了,但我需要它们作为Singletons ...

在这里帮助我,也许你知道更好的设计模式。

3 个答案:

答案 0 :(得分:1)

您根本不需要使用静态变量

<?php
Class Base{
 public $Config;
}

Class System Extends Base{
 Public static $obj = null;
 Public static Function HelloWorld() {
  if (!System::$obj) System::$obj = new System();

  // call the object functions
  // $obj->HelloWorld();
 }

 Public Function __Construct()
 {
     $this->Config = 2;
 } 
}

Class Core Extends Base{
 Public Function __Construct()
 {
     $this->Config = 3;
 }
}
?>

答案 1 :(得分:0)

我想出了一个比较好的解决方案。对于可能遇到同样问题的人,请参阅here

答案 2 :(得分:-1)

<?php
// static change the attributes of the scope
class base
{
    public static $config;

}

class a extends base
{
    public function __construct()
    {
        self::$config = 1;
    }
}
class b extends base
{
    public function __construct()
    {
        self::$config = 2;
    }
}

a::$config = 2;
b::$config = 3;
echo a::config, ',', b::$config; // 3,3
$a = new a();
echo base::$config, a::$config, b::$config, $a::$config; // 1 1 1 1