1

我已经为这个问题绕了几个小时。也许这根本不可能,或者也许有更好的 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 类,但我需要它们作为单例......

帮帮我,也许你知道比这个更好的设计模式。

4

3 回答 3

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;
 }
}
?>
于 2013-01-06T13:26:48.450 回答
0

为此,我想出了一个相对较好的解决方案。对于那些可能面临同样问题的人,请参阅此处

于 2013-01-07T13:52:54.773 回答
-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
于 2013-01-06T13:54:36.410 回答