3

私は正式に知的障害者です。【説明させてください】

今日まで、クラスとその関係について考えたことはありませんでした。かなり明白だと思われる何かを理解しようとしていますが、私は愚かであるため、それを見ることができません。

さまざまなファイルから拡張される Core Class があるとします。子クラスはどのようにして他の兄弟から関数を呼び出すことができますか (つまり、それらが子と見なされる場合)。サンプルコード: (私を殺さないでください)

class cOne { 
    public function functionOne(){
       echo "something";
    }
}

次に、別のファイルで、次のように言います。

class cOneChildOne extends cOne { 
    public function functionOne(){
       echo "something from child one";
    }
}

さらに別のファイルでは、次のように言います。

class cOneChildTwo extends cOne { 
    public function functionOne(){
       echo "something from child two";
    }
}

子クラスと親クラスの両方から機能にアクセスできるようにするには、新しいオブジェクトをいつどのように作成する必要が$newObject->Children->function();ありますか?そしてまともに考えられない。

$newObject = new cOne;オブジェクトを作成しますが、サブクラスの1つからのコードは、コアクラスまたはそれ自体に直接含まれていないものにはアクセスできません。

ありがとう

4

9 に答える 9

2

マスタークラスの静的配列で子インスタンスを収集できます

class C1{  
  static public $childs=array();
  function __construct(){
    self::$childs[]=$this;    
  }
}
class C1C1 extends C1{
  function hi(){
    echo 'hi from C1C1 <br />';
  }  
}
class C1C2 extends C1{
  function hi(){
    echo 'hi from C1C2 <br />';
  }    
}

$c1 = new C1C2();
$c2 = new C1C2();
$c3 = new C1C1();
$c4 = new C1C1();
$c5 = new C1C1();
$c6 = new C1C1();
foreach(C1::$childs as $c){
  $c->hi();
}
于 2010-06-26T17:54:32.740 に答える
1

親クラス cOne は、php でそれを拡張するクラスを認識していないため、 を使用して子クラスから親を呼び出すことはできますが、親から子クラスをparent::someFunction()呼び出すことはできません。また、cOne を拡張するクラスから cOne を拡張する他のクラスの関数を呼び出すこともできません。これは、cOne がそれを拡張するクラスを認識していないためです。

于 2010-06-26T17:37:10.597 に答える
0

なぜクラスに を持たず、それを拡張するクラスのstatic Array $childrenメソッドが単に を呼び出すことができないのでしょうか? それらはそれぞれ、リクエストをスーパークラスに送信する関数を実装できます-それは機能しないでしょうか?cOne__construct()cOne::addChild($this)getChildren

于 2010-06-26T18:04:55.910 に答える
0

parent::functionOne();子クラスから親クラスの関数を呼び出すために使用できます。親クラスから子クラスの関数を呼び出すことはできません。

于 2010-06-26T17:34:23.280 に答える
0

私を助けるか、私を撃ってください!!

バン!!! =o)=o)=o)

s methods and methodクラスのインスタンスを作成するとき、それは親からのものだけを知っています。同じ親を拡張している他のクラスがあることを伝える方法はありません。

于 2010-06-26T17:38:05.557 に答える
0

kgb が言うように、両方の兄弟クラスの動作に「アクセス」できる1 つのオブジェクトを作成することはできません。cOneChildOne をインスタンス化すると、「子の何か」を出力するものを取得できます (*)。を使用する場合parent::functionOne()、cOne の動作をコピーして、「子 1 から何か\n何か」などを返すことができます。

(*) しないでください。むしろ、文字列を返します。

public function functionOne(){
   return "something from child one";
}

これにより、関数を作成したり、ファイルに出力したりできます。

于 2010-06-26T17:38:14.103 に答える
0

これで要件が満たされる場合は、常に cOneChildOne 内から静的に cOneChildTwo を呼び出すことができます。$thisメソッド内では、常に呼び出し先オブジェクトを指す (parent::__construct() の動作方法) ため、cOneChildTwo 内で呼び出し先の状態を使用して動作を拡張できます。

ただし、これは、すべての兄弟のメソッドにラッパー メソッドが必要であることを意味する可能性があります。ただし、これはリフレクションで解決できないものではありません。

于 2010-06-26T17:40:33.320 に答える
0

あなたは根本的な誤解をしています。

あなたの 2 つのサブクラスは、共通の祖先を持つ異なるクラスです。各子は本質的に親の知識を持っていますが、親は子の知識を持っておらず、子はお互いの知識を持っていません。

child1 が child2 のメソッドを呼び出せるようにするには、設計に問題があります。1 つの解決策は、メソッドを child2 から親クラスに移動して、child1 もそのメソッドを継承するようにすることです。

于 2010-06-26T17:48:39.883 に答える
0

オブジェクトの継承、クラス、およびそれらの関係を間違った方法で見ていると思います..あなたが言ったことは、オブジェクト指向プログラミングの継承が実際にどのように機能するかではありません。他のオブジェクトのメソッド/関数を呼び出したい場合、それが同じクラスのインスタンスであるかどうかに関係なく、呼び出すオブジェクトへの参照が必要です。ここでのキーワードは参照の受け渡しです。呼び出したいものには、通信したいオブジェクトへの参照が必要です。

 child1.communicateWithAnotherChild(someOtherChild)
于 2010-06-26T17:49:51.993 に答える