【 PHP 】PHP8に入門してみた 206日目 PHPの基本 ( オブジェクト指向 トレイト)
PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。
オブジェクト指向
部品? トレイト
トレイトとは、再利用可能なメソッドの集まりです。
複数のクラスで同じコードを共有する場合に役立ちます。
いわゆる「共通化」ですね。
クラスは複数のトレイトを使うことができ、トレイトはそのクラスにコードを「注入」します。
「継承」ではなく、「注入」なんです。ここがポイントですね。
トレイトはクラスに継承されるわけではなく、必要なときにクラスにuse
してトレイト内のメソッドをそのクラスで利用することができます。
トレイトは、クラスにコードを追加することができるため、クラスの再利用性を向上させることができます。
クラスの機能を横断的に拡張するために使用されることが多く、「多重継承のような」複雑な機能を実現することができます。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>こんにちは!</title>
<!-- Bootstrapを有効化 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
</head>
<body>
<?php
// トレイトはtraitを記述します。
trait MyTrait
{
public function method1()
{
print("Hey!");
}
public function method2()
{
print("Hey!Yo!");
}
}
class MyClass
{
// 使うときはuseです。
use MyTrait;
}
// ファクトリーメソッドを使用してオブジェクトを生成する
$cls = new MyClass();
$cls->method1(); // Hey!
$cls->method2(); // Hey!Yo!
?>
</body>
</html>
使いどころ
- 複数のクラスで同じコードを使用する場合
- クラスの階層を深くすることができない場合
- 既存のクラスに新しい機能を追加する場合
「継承」じゃダメなの?
トレイトが継承に勝るポイントをいくつか挙げてみます。
- 複数のトレイトを同時に使用できる
クラスは単一継承であるため、複数のクラスから同時に機能を継承することはできません。
しかし、トレイトを使用することで、1つのクラスで複数のトレイトを同時に使用することができます。
これにより、機能の組み合わせが柔軟に行えるようになります。 - 菱形継承問題を回避できる
多重継承を行う場合、複数の親クラスから同じメソッドやプロパティを継承する場合があり、このような場合に菱形継承問題が発生することがあります。
しかし、トレイトは菱形継承問題を回避することができます。(PHPは単一継承なのでこの問題は起きないですよね😅) - コードの再利用が容易
トレイトは、再利用可能なメソッドをまとめたものであり、複数のクラスで同じ機能を実装する必要がある場合にコードの再利用が容易になります。 - クラス階層を浅くできる
継承による機能の追加は、クラス階層を深くしてしまうことがあります。
しかし、トレイトを使用することで、クラス階層を浅くすることができます。
このためコードの理解性や保守性を高めることができます。
メモ
PHPのトレイトはRuby言語のmixinに似た概念のようです。
mixinはRuby言語のモジュールと呼ばれる機能を使って実現されます。
モジュールは複数のクラスに共通する機能をまとめることができ複数のクラスに同じ機能を提供することができます。
トレイトとモジュールの共通点として、「複数のクラスで同じ機能を再利用することができる」点が挙げられます。
また、トレイトやモジュールは、「クラスの継承に代わる機能を提供する」ことができます。
ただし、PHPのトレイトとRubyのmixinにはいくつかの違いもあります。
例えば、PHPのトレイトはメソッドやプロパティの可視性を指定することができますが、Rubyのmixinにはそのような機能はありません。
また、PHPのトレイトはクラスに継承される前に使用することができますが、Rubyのmixinはクラス定義の中で include する必要があります。
トレイトとmixinは共通点も多く、クラスの再利用性を高めるための重要な機能として利用されています。
ディスカッション
コメント一覧
まだ、コメントがありません