PHPにおいて基底クラスを作成しようと思っているのですが、abstractとtraitのどちらでも作成できるかと思います。これらの違いは何でしょうか?
使い分けやメリット・デメリットなどを踏まえて教えていただけますでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
1つ例をあげさせていただくと、abstract を用いた次のようなコード。
lang
1<?php 2abstract class AbstractHoge 3{ 4 public function func() 5 { 6 echo "hoge\n"; 7 } 8} 9 10class Hoge extends AbstractHoge {} 11 12function main(AbstractHoge $obj) 13{ 14 $obj->func(); 15} 16 17$obj = new Hoge(); 18main($obj);
trait は型とは違うので、次のように単純に置き換えることはできません。
lang
1trait HogeTrait 2{ 3 public function func() 4 { 5 echo "hoge\n"; 6 } 7} 8 9class Hoge 10{ 11 use HogeTrait; 12} 13 14function main(HogeTrait $obj) 15{ 16 $obj->func(); 17} 18 19$obj = new Hoge(); 20main($obj);
同じようなことがやりたければ interface を使う必要があります。
lang
1interface HogeInterface 2{ 3 public function func(); 4} 5 6trait HogeTrait 7{ 8 public function func() 9 { 10 echo "hoge\n"; 11 } 12} 13 14class Hoge implements HogeInterface 15{ 16 use HogeTrait; 17} 18 19function main(HogeInterface $obj) 20{ 21 $obj->func(); 22} 23 24$obj = new Hoge(); 25main($obj);
このようなインタフェースの実装を提供する使い方が、トレイトがよく使われる定番のパターンだと思います。
PSR-3 の Logger でもこのパターンは使われています。
投稿2015/07/03 10:50
総合スコア4514
0
traitは基底クラスでは御座いませんので、基底クラスを作りたいのであればabstractクラスを作るだけではないでしょうか?
PHPは単一継承のみですので、そこに問題があった場合に使うのが5.4から実装されたtraitのはずです。
ですので、メリット・デメリットなどというものはなく、全く別物であるはずです。つまり、併用されれば良いだけではないでしょうか?
投稿2015/07/03 07:48
編集2015/07/03 08:20退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。