1

私はこの問題で数時間輪になって走ってきました。まったく不可能かもしれませんし、これにはもっと良い OOP ソリューションがあるかもしれません...

例: 私は 2 つのクラスを持っています。

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 属性を基本クラスから継承する必要があるのは、ほぼすべてのクラスで必要になるためです。

問題は、別のクラスが独自の値を設定するため、 $Config 属性が Sonn として自身をオーバーライドすることです。

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

それが起こる理由を私は理解しています: Base::$Config は Static であり、そのように - すべての子を通して共有されているからです。私はこれを望んでいません。各子で静的にしたいのですが、子のトラフではありません。System クラスと Core クラスを実際にインスタンス化しても問題ありませんが、Singleton として必要です...

ここで私を助けてください。これよりも優れたデザインパターンを知っているかもしれません。

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 に答える