2012-01-13 6 views
0

次作品:親を呼び出す子オブジェクトを保持する可能性はありますか?コードの

class a{ 

     public function __get($key) { 
      if($key == 'obj') { 
       if($b->obj == null) { //PSEUDO this is what I intend to do :) 
        $obj = new Obj();       
        $b->obj = $obj 
       } 
       return $obj; 
      } 
     } 
    } 

class b extends a{ 

     private $obj = null; 


     public function __get($key) { 
      return parent::__get($key); 
     } 

    } 

だから、アイデアは、必要に応じてオブジェクトを作成することです。しかし、parent :: _ getメソッドを呼び出すオブジェクトのクラスを検出できるかどうかはわかりません。子供のようないくつかの演算子は私が推測するものです:)。

たとえば、私はCountryというオブジェクトを1つ持っているので、自分のクラスでCountryオブジェクトと別のクラスLocationを持つUserを定義します。Countryオブジェクトもあります。どちらのクラスもクラスaを拡張しています。クラスaからifブロックをそれぞれの子クラスに書くことで、この問題を解決できました。しかし、それは私がしたくないことです。したがって、どのクラスが__get関数を呼び出すかをチェックし、目的のCountryオブジェクトを子クラスに直接設定することがより簡単になります。私は私の問題がはっきりし、それはあまりにも変わったheheではないことを願っています。私は他のソリューションにもオープンしています...ありがとう。

答えて

0

http://codepad.org/Qnc938Wv

class a{ 

    public function __get($key) { 
     if($key == 'obj') { 
      if($this->_obj == null) { //PSEUDO this is what I intend to do :) 
       echo "creating "; 
       $obj = new StdClass();       
       $obj->what = get_class($this); 
       $this->_obj = $obj; 
      } 
      return $this->_obj; 
     } 
    } 
} 

class location extends a{ 
    protected $_obj = null; 
    public function __get($key) { 
     return parent::__get($key); 
    } 
} 

class user extends a{ 
    protected $_obj = null; 
    public function __get($key) { 
     return parent::__get($key); 
    } 
} 

$l = new location(); 
echo $l->obj->what . "\n"; 

$u = new user(); 
echo $u->obj->what . "\n"; 

echo $l->obj->what . "\n"; 
echo $u->obj->what . "\n"; 

これは

creating location 
creating user 
location 
user 
+0

はい、これはどういうわけか私の解決策です。ここでの問題は、クラスaに_objというメンバーがないため、$ this - > _ obj == nullが常に真です。これは基本的に、このオブジェクトを既に持っているかどうかを子クラスに尋ねる必要があるポイントです。この方法では、メンバーにアクセスするたびにオブジェクトを作成し続けます。 – samy

+0

まあ、いいえ。出力オブジェクトが2回目にフェッチされるときに一度だけ作成されるのを見てください。 – bububaba

+0

申し訳ありません、ありがとう、問題は、私のメンバーは私の部屋は、母クラスは、それらを更新できませんでした:)ありがとう! – samy

0

__get()メソッド(多くのクラス間でを拡張してを介して共有する)を知りたい場合は、呼び出されたオブジェクトのクラスはget_called_classです。

+0

そうになり、それが唯一の私のクラスを渡します、私は一人でクラスが助けにはならない、get_calling_objectようSTH必要です。静的メソッドについては言及していません。& – samy

+0

これは、親クラスで '$ this'を使用することとは違いますか?私の更新された答えを見てください。 – bububaba

関連する問題