ホームページ  >  記事  >  バックエンド開発  >  PHP 多重継承についての理解

PHP 多重継承についての理解

小云云
小云云オリジナル
2018-03-22 13:01:272231ブラウズ

PHP の多重継承は非常に混乱しており、曖昧さがあり、Diamond of Death の継承ツリーは両端が小さく、中央が大きいため、代わりに trait が使用されます (明瞭で再利用可能なコードが実現され、フラット メソッドがより明確になり、曖昧さは解決しました) (どのメソッドを使用して実行すべきか、そうでないとエラーが報告されます)

昨夜、多重継承を使用するかどうかについて G と話し合いました。その時、私はそれに強く反対しました。私の意見では、多重継承は非常に悪いことであり、軽蔑されるべきだと考えていました。主な理由は、プログラミングでも設計でも、あらゆる種類の混乱を引き起こしやすいと考えているからです。私は多重継承を使用したことがないので、その詳細についてはよく知りませんでした。これは、このことについて知り、試験後すぐに捨てたからです。このことを詳しく理解するために、ネットでパブリックコメントを見つけました。その利点は明らかで、単純で明確であり、再利用が容易になりますが、多重継承を使用すると、重複コードが大幅に削減されます。たとえば、Baidu Encyclopedia の例では、猫は哺乳類クラスと漫画クラスの両方から継承できるため、漫画クラスの属性とメソッドを書き直す必要はありません。 1 つ目はあいまいさです。2 つの基本クラスに同じ名前のメソッドが存在します。場合によっては、このメソッドがサブクラスの呼び出しでどの基本クラスからのものであるかを指定する必要があります。これは少し面倒なようです。混乱している場合: クラス A が B と C を導き出し、B と C が共同で D を導き出し、この種の大きな中端と小端を持つ継承ツリーのイメージ名は、Diamond Inheritance Tree (DOD: 「死」の文字通りの意味からすると、これは非常に珍しいことです。確かに、A は D の親クラスですが、この方法でデータを整理すると、予期せぬ結果が生じる可能性があります。曖昧さは別として、D に同じ名前のデータ メンバーがいくつあるかを考えてください。「DOD は絶対に避けてください。ここでは DOD が最適であると考えない限り、必ず virtual を使用してください。」基本クラス (仮想継承) については、各クラスの詳細を完全に理解して、仮想基本クラス (仮想継承) の副作用を必ず理解してください。「ここで、vtable (C++ では、vtable) という別の語彙が導入されています。 PHP にそれがあるかどうかは不明ですが、Baidu にはあるはずです。) Vtable: 仮想関数を持つすべてのクラスには、実際にこのクラス内のすべての仮想関数の関数ポインターが記録されます。たとえば、関数ポインタの配列の先頭は、配列の 2 番目の要素に記録されます。このクラスのオブジェクト インスタンスが TheSecondFun を呼び出すと、対応する関係に従って 2 番目の関数ポインタが取り出されます。この動作は遅延バインディングと呼ばれます。これは、コンパイル段階で決定される早期バインディングではなく、呼び出された関数が実行時にどのようになるかしか分からないことを意味します。多重継承により、サブクラスの vtable が異常になる場合もあります。単一継承された vtable は、親クラス vtable の末尾に新しい仮想関数を追加するだけであり、サブクラス オブジェクトの vtable には順序付けされた親クラス vtable が含まれます。多重継承の場合、2 つの親クラスは完全に異なる vtable を持つ可能性があるため、サブクラスの vtable に 2 つの親クラスの完全な順序付けされた vtable を含めることは絶対に不可能です。サブクラスの vtable には、切断された 2 つの親クラス vtable が含まれる場合があるため、各親クラスは強制的に vtable を追加することになります。つまり、ポインターが各親クラス オブジェクトに追加されます。 多重継承は、他にもいくつかの問題を引き起こします。親クラス ポインタを使用してサブクラス オブジェクトを指すと、複雑な問題になります。キャストを実行するには、C++ で提供される Dynamic_cast を使用する必要があります。また、dynamic_cast に関しては、コンパイル時ではなく実行時に変換するので、若干のパフォーマンスの低下を引き起こすだけでなく、コンパイルが必要になります。コンパイラでは、RTTI (Runtime Type Information、ランタイム型情報) が許可されており、コンパイラはすべてのクラスのランタイム情報を保存する必要があります。 要約すると: 現実の世界では、多くの場合、いくつかの物事は 2 つ以上の属性を持ちます。この問題を解決するために、多重継承の概念が導入されます。 多重継承の利点は、オブジェクトが複数の基本クラスのインターフェイスを呼び出せることです。 多重継承の欠点は、継承が上方に曖昧になりやすく、プログラムが複雑になることです。 提案: 多重継承は慎重に使用してください。 最後に、存在は合理的です。

以上がPHP 多重継承についての理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。