2009-06-17 7 views
0

私は別のクラスを作成し、PHPでクラスを持っている、と私はこの子クラスは親クラスを呼び出すことができるようにしたいが、子クラスへの引数として$これを介さず。私は親クラスをグローバルにしたくない。親クラスを呼び出す方法はありますか、どういうわけかparent-> functionまたはそれに類するものでしょうか?PHP:あなたを作成したクラスを呼び出すことは可能ですか?

+0

あなたは親が第二クラスのコンストラクタに$これをで通過することなく何であるかを知ることはできません。 PHPはそれをしません。 –

+0

"class"、 "parent"、 "child"の使い方はかなり誤解を招く(または単に間違っています;-))。あなたは主にクラス(オブジェクト)のインスタンスについて話しています。クラスベースのoopでは、「クラスFoo extends Bar」のような「親クラス」だけの「親オブジェクト」はありません(私は誰かが私を証明するのを待っています間違って...) – VolkerK

+0

ママ!ムーアム! Muuuuuuuuuuuum!彼女は聞いていません.... – cjk

答えて

0

それは一種のハッキングが、私はあなたが(「親」の階層クラスに無関係のインスタンスを保持している親子関係がちょうど組成物であると呼んでいるものだと思うdebug_backtrace()

4

を分析しようとすると、「です子')。私の前提が正しければ、2つのクラスが緊密に結合され、どこかに悪いデザイン(「親」、「子供」、またはその両方)を指しているので、これは悪いことです。

あまり臭い選択肢:

  • 「子」から必要なデータを取得し、そのデータ
  • と「親」でメソッドを呼び出して「親」は「子」に保持するデータを渡します「子」がそれを呼び出すことができるようにメソッドを配置します。
  • 「親」のメソッドを呼び出し、その結果を「子」に渡します。
  • 継承を使用すると、「親」と'子ども'は本当に親と子になり、どちらもこの方法を持っていれば、 '親'は「子」を作成すると、コード内の子を直接使用します。マチェイが言うよう
2

、これはかなりハックであり、私はそれをお勧めしませんが、それは可能です:

<?php 

    class B 
    { 
     function B() { 
      $trace = debug_backtrace(); 
      $trace[1]['object']->y(); 
     } 
    } 

    class A 
    { 
     function x() { 
      $z = new B; 
     } 
     function y() { 
      printf("hi"); 
     } 
    } 

    $test = new A; 
    $test->x(); 

?> 
+1

+1悪い方法を示す誘惑に抵抗しないために+1: –

+1

+1。おそらくOPの貧弱な後継者を痛みの世界に導入し、OPがsetParent()を実装するにはあまりにも怠惰であるため、熟練したコーダーの間にいくつかの敵を作ったでしょう。 – stefs

+0

@Schnalle、ねえ!上にはかなりの免責事項があります! :) –

0

(...)しかし、引数として$これを通過せず子クラスに

天、WHY? "見て、私は私の手で持っていないでおしっこをすることができます。

、それはとても簡単かもしれないが、私は、これは禁止されている理由は、我々が知っていることは決してないだろうと仮定します。私の推測では、OOPを理解できないだけです(クラス階層とインスタンス階層の間の混乱が示唆するように)、あなたはそれを学ぶのが面倒です。 Ceci n'est pas une pipe!

見て:はい、それは簡単

<?php 
    class AClass { 
     public $parent = false; 

     public function setParent($parent) { 
      $this->parent = $parent; 
     } 

     public function createChild() { 
      $newInstance = new AClass(); 
      $newInstance->setParent($this); 
     } 
    } 
?> 

です!あなたは今親を持っています。

かは、親クラスを変更することが許可されていないので、それは、ありますか?
は秘密があるのですが、私はあなたに教えてあげる:悪ウォーロックのため

0番目のレベルのキャントリップ:inheritance、また「class B extends A {}」として知られているが。

私が意味する、sarcasic、役に立たないお尻であることのため、事前に謝罪、しかし、私が本当に謝罪の後ろに立っていたと思いますが、私はその答えを書かれていません。

BUT私は、あなたが私たちに参照渡しが禁止されている正当な理由を与えることができれば、あなたの質問に投票することを約束します(正直にお詫び申し上げます)。

+0

私はあなたがひび割れしているかもしれないと思います...? – cjk

+0

申し訳ありませんが、私は定期的に人々が言うスナップ: "助けて、私はxを行う必要がありますが、明白で、簡単で、よくテストされた、受け入れられた方法ではないので...私は、与えられた! " – stefs

+0

seesh、今私はすでに悪い気分です。しかし、私はまだ "なぜ"に興味がありますか? – stefs

0

私はこれが可能かどうかを知るには十分ではありませんが、オブジェクトのコンストラクタにデリゲート/コールバックを渡すことはできませんか?この方法では、オブジェクト全体が呼び出されるメソッドへの参照だけがありません!

HTH

ワンショット

関連する問題