🤖
触って学べる図解:extendsとTraitの違いをロボット工場で例えてみた
はじめに
こんにちは!
オブジェクト指向を勉強していると、必ず出てくる extends(継承) と Trait(トレイト)。
「なんとなくわかるけど、どう使い分けるの?」って思いませんか?
今回は、ロボット工場に例えながら、クリックして遊べるインタラクティブな図解で、この2つの違いをざっくり理解してみましょう!
まずは触ってみよう!
百聞は一見にしかず。まずは下のカードをクリックしてみてください👇
extends(継承)とは?
extends は、親クラスの設計図を丸ごと引き継いで、新しいクラスを作る仕組みです。
class Robot {
public function move(): void
{
echo "歩く";
}
}
// BasicRobotはRobotの機能を全部引き継ぐ
class BasicRobot extends Robot {
public function greet(): void
{
echo "こんにちは!";
}
}
$robot = new BasicRobot();
$robot->move(); // 親から引き継いだ "歩く"
$robot->greet(); // 自分の "こんにちは!"
extendsのポイント
- ✅ 親の機能を丸ごと引き継げる
- ✅ コードの再利用がしやすい
- ❌ 親は1つだけ(PHPは単一継承)
- ❌ 「車」と「ロボット」を同時に親にできない
Trait(トレイト)とは?
Trait は、クラスに特定の機能だけをあとから追加できる仕組みです。
まるでロボットにオプションパーツを後付けするイメージです!
// 「飛ぶ」機能のTrait
trait CanFly {
public function fly(): void
{
echo "飛んだ!";
}
}
// 「炎を出す」機能のTrait
trait CanFlame {
public function flame(): void
{
echo "炎!";
}
}
// 複数のTraitを同時に使える!
class SuperRobot {
use CanFly, CanFlame;
}
$robot = new SuperRobot();
$robot->fly(); // "飛んだ!"
$robot->flame(); // "炎!"
Traitのポイント
- ✅ 複数のTraitを同時に使える
- ✅ 欲しい機能だけをポン付けできる
- ✅ 異なるクラスに同じ機能を共有できる
- ❌ 単体でインスタンス化はできない(あくまで「パーツ」)
まとめ:使い分けの基準
extends |
Trait |
|
|---|---|---|
| イメージ | 設計図の丸コピー | オプションパーツの後付け |
| 使える数 | 1つだけ | いくつでも |
| 向いている場面 | 「〇〇の一種」という関係 | 「〇〇できる」という機能追加 |
| 例 | Dog extends Animal |
use CanSwim, CanRun |

おわりに
extends と Trait はどちらも「コードを再利用する仕組み」ですが、目的が違います。
-
extendsは親子関係を表す -
Traitは機能の追加に使う
この違いを意識するだけで、クラス設計がぐっとスッキリしますよ!
最初のインタラクティブ図解でも確認できるので、ぜひ何度でも触って感覚をつかんでみてください🤖
Discussion