-1

クラス'base'とクラス'loader'があり、次のようになります。

class base {

    protected $attributes = Array();   
    public $load = null;           

    function __construct() {

        $this->load = loader::getInstance();  
        echo $this->load->welcome(); //prints Welcome foo
        echo $this->load->name; //prints Foo
        echo $this->name; //doesnt print anything and i want it to print Foo

    }


    public function __get($key) {

        return array_key_exists($key, $this->attributes) ? $this->attributes[$key] : null;
    }

    public function __set($key, $value) {

        $this->attributes[$key] = $value;
    }
}

class loader {

    private static $m_pInstance;       

    private function __construct() {

        $this->name = "Foo";

    }

    public static function getInstance() {
        if (!self::$m_pInstance) {
            self::$m_pInstance = new loader();
        }

        return self::$m_pInstance;
    }

    function welcome() {
        return "welcome Foo";
    }

}

$b = new base();

今私が欲しいのは、ローダークラスから変数を格納し、を使用して基本クラスからそれらにアクセスする方法$this->variablenameです。

どうすればこれを達成できますか?使いたくないextends。何か案が ?

4

3 に答える 3

2

OOPの方法をコーディングすることの意味を完全に理解しているとは思えません。そして通常、シングルトンはコードの臭いなので、警告します。

おそらくあなたの目標を達成するためのより良い方法があります。あなたがより多くの情報を提供するならば、私たちはあなたを助けます。現在の形式では、答えは次のとおりです。私があなたのコードにその実装を強くお勧めしないことを覚えておいてください。

クラスのようにパブリック(および非静的)loaderの変数のみにアクセスする場合は、基本クラスのコンストラクターの先頭に次の行を挿入するだけです。this->varnamebase

$this->attributes = get_object_vars(loader::getInstance());

これにより、基本的にすべてのローダーパブリック変数で属性配列が初期化され、__get()メソッドを介してその値にアクセスできるようになります。

ちなみに、シングルトンの使用を避けるために、依存性注入のデザインパターンを見てください。

于 2012-12-11T11:06:11.450 に答える
1

__get / __ setメソッドはアクセスしますが、アクセス$this->attributesしません$this->load
たとえば、(擬似コード)のようなことをすることができます

function __get($key) {
  - if $attribute has an element $key->$value return $attribute[$key] else
  - if $load is an object having a property $key return $load->$key else
  - return null;
}

参照:http ://docs.php.net/property_exists

于 2012-12-11T10:48:58.387 に答える
0

静的変数を作成すると、どこからでもこの変数にアクセスできます

public statis $var = NULL;

このようにアクセスできます

classname::$var;
于 2012-12-11T10:48:36.017 に答える