※この記事は読者によって投稿されたユーザー投稿のため、編集部の見解や意向と異なる場合があります。 また、編集部はこの内容について正確性を保証できません。
ヒューマンリソシア株式会社はコラム「トレイトについて その3」を公開しました。 タイトル的には「traitのお話」ではあるのですが。 その源流になるあたりの理屈を、今回は追いかけてみましょう。 まず「継承」を主眼に考えてみます。 PHPにも存在しているのが「単一継承」で、これは例えば、以下のようなコードで実際に書く事ができます。 // クラス定義 class hoge { } // hogeを継承したfooクラスの定義 class foo extends hoge { } 「単一」があるので、勿論「多重継承」という概念も、世間様的には存在します。 ただ、じゃぁPHPでこんな風に書けるか、というと… class hoge { } class foo{ } // hogeとfooを継承してみる class bar extends hoge, foo { } これは駄目なんですね。PHPでは、多重継承は文法レベルで「明示的に禁止」されています。 ちなみに多重継承が可能な言語ですが、おいちゃんが使っている範囲ではC++。 あとは、Pythonが可能なようであります。 一方で。例えばJavaが「多重継承はできない」言語、になっています。 PHPはこの「多重継承はできない」ほうのカテゴリーに属します。 さて。なんで「出来ない」言語があるんだろう? っていうお話になるんですが、 まぁ端的には「割と問題が起きやすいから」ってところになります。 具体的にその「問題」を、少し、眺めてみましょう。 一つには「名前の衝突」の問題があります。 PHPが多重継承できると仮定して、こんなコードを書いてみましょう。 class hoge { public function test() {} } class foo { public function test() {} } // class bar extends hoge, foo { public function test() { parent::test(); } } クラスbarのtestメソッドの中で「親のtestメソッドを呼ぶ」ために、parent::を使いました。 …さて、この場合のparentは、hogeになるのでしょうか? fooになるのでしょうか? この続きは以下をご覧くださいhttp://resocia.jp/column/4824/
この記事のキーワード

人気記事トップ10

人気記事ランキングをもっと見る