0

「ローカルグローバルプロパティ」を保持する単一インスタンスの親クラスがあり、すべての子クラスがアクセスできる必要があります(変更された場合も)

インスタンス化された親からの子が親の値を確実に継承するようにする 2 つの方法を考えることができます。

1) 静的変数の使用

class p
{
public static $var = 0;
}

class c extends p
{
function foo()
{
echo parent::$var;
}
}

$p = new p;
$c = new c;

$c->foo(); //echoes 0
p::$var = 2;
$c->foo(); //echoes 2

2) 渡されたオブジェクトの使用

    class p
    {
          public $var = 0;
    }

    class c extends p
    {
           function update_var(p $p)
      {
            $this->var = $p->var;
      }

    function foo()
    {
    echo $this->var;
    }
    }

    $p = new p;
    $c = new c;

    $c->foo(); //echoes 0
    $p->var = 2;
$c->update_var($p);
    $c->foo(); //echoes 2

私の意見では、静的ソリューションは最も洗練されたソリューションですが、私が見ていないいくつかの欠点があるかもしれません。どの解決策が最善だと思いますか、または 3 つ目のより良い選択肢はありますか?

(また、この例では、この例を説明しやすくするために $var が公開されていますが、最終的には保護されることに注意してください)

4

2 に答える 2

1

すべての子クラスがアクセスできる必要があります(変更された場合も)

これは、静的変数を使用する必要があることを意味します。これは、まさにそのために設計されたものだからです。

別のオプションは定数を使用することですが、それらがクラスにうまく収まる場合は、それstaticが道です

編集: または、もう少し複雑なものが必要な場合は、@true が提案するパターンを使用できます。

于 2013-01-29T09:16:03.550 に答える
1

おそらく、すべてのオブジェクトに注入できる変数のストレージとして別のオブジェクトを用意する方がよいでしょうか?

変数を更新するというアイデアはクレイジーなようです。

必要なコードが少ない場合は、静的変数を使用してこれを行うことができますが、すべてのクラスに注入される構成コンテナーをいくつか実行します (依存性注入について読む: http://en.wikipedia.org/wiki/Dependency_injection )

class Config
{
    protected $vars;

    public function __get($name)
    {
        if (isset($this->vars[$name])) {
            return $this->$name;
        }
    }

    public function __set($name, $value)
    {
        return $this->vars[$name] = $value;
    }

    public function toArray()
    {
        return $this->vars;
    }
}

class Component 
{
    protected $config;

    public function __construct(Config $config = null)
    {
        $this->config = $config;
    }

    public function getConfig()
    {
        return $this->config;
    }
}

// Create config instance
$config = new Config();

// Store variable
$config->testVar = 'test value';

// Create component and inject config
$component = new Component($config);

// Save another one variable in config
$config->test2Var = 'test 2 value';

// Create one more component and inject config
$component2  = new Component($config);

// Create one more varible
$config->someMoreVar = 'another one variable';

// Check configs in different components, values will be same (because config object is not cloned, just link to this object is saved in Component's $config property):
var_dump($component->getConfig()->toArray());
var_dump($component2->getConfig()->toArray());

PS アイデアを示すためだけに、このコードをテストしていません

于 2013-01-29T09:21:51.930 に答える