知りたいこと
php学習中ですが、trait
を使う価値がある状況が想像できないので、どなたか教えていただけませんでしょうか。
納得いかないポイント
納得いかないポイントは次の [STEP 3] においてでして・・
[STEP 1] trait
に log()
を実装する
[STEP 2] class
内で use
する
[STEP 3] class
内で $this->log()
を実行できるようになる
・・・いやこれじゃ log()
を class
が持っているように誤認するので分かりにくい!という「メソッド迷子状態」になる点が納得いきません。不便ではないでしょうか?
そしてこの点は以下 コード比較のように、そもそも trait
でなく class
を使えば解消できると考えており、そのために trait
を使う価値がある状況が想像できないのです。
コード比較
以下に trait バージョン と class バージョン を比較し、いかに後者が優れており、trait
が無用の長物で月夜に提灯で蛇足であるかを示します。(もちろん浅慮な考えでしょうから、アドバイス頂けますと幸いです。)
trait バージョン
先述のように $this->log()
のように実行され、使う価値があるとは思えません。これでは // log を UserTest が持っているように誤認する
ので、メソッド迷子状態になるだけだと思うのです。
php
1<?php 2 3trait TestLogger { 4 public array $logs = []; 5 6 public function log(string $message): void { 7 $this->logs[] = $message; 8 } 9} 10 11class UserTest { 12 use TestLogger; 13 14 public function run(): void { 15 $this->log("Test started"); // log を UserTest が持っているように誤認する 16 print_r($this->logs); 17 } 18} 19 20// 実行 21(new UserTest())->run();
class バージョン
一方でこちらは $this->log()
でなく $this->testLogger->log()
のように実行されますので、メソッド迷子にならないと思うのです。
php
1<?php 2 3class TestLogger { 4 public array $logs = []; 5 6 public function log(string $message): void { 7 $this->logs[] = $message; 8 } 9} 10 11class UserTest { 12 public TestLogger $testLogger; 13 14 public function __construct() { 15 $this->testLogger = new TestLogger(); 16 } 17 18 public function run(): void { 19 $this->testLogger->log("Test started"); // log を testLogger が持っているとすぐわかる 20 print_r($this->testLogger->logs); 21 } 22} 23 24// 実行 25(new UserTest())->run();
以上です。
お詳しい方、よろしくお願い致します。

回答1件
あなたの回答
tips
プレビュー