Edited at

[PHP]抽象クラスとTraitのコードを見比べる。

More than 3 years have passed since last update.


書き比べればなんとかなるはず


抽象クラス


abstract.php

<?php

abstract class Working
{
abstract protected function where();
abstract protected function why();
abstract protected function how();

public function work()
{
echo $this->where($where);
echo $this->why($reason);
echo $this->how($how);
}
}

class Person extends Working
{
protected function where()
{
return '横浜で';
}

protected function why()
{
return 'お金欲しいから';
}

protected function how()
{
return '営業する';
}
}

$bob = new Person();
$bob->work(); // 横浜でお金欲しいから営業する



trait

traitの1文字目は小文字、のはず…

http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html


trait.php

<?php

trait Working
{
protected function where($where)
{
return $where;
}

protected function why($reason)
{
return $reason;
}

protected function how($how)
{
return $how;
}

public function work($where, $reason, $how)
{
echo $this->where($where);
echo $this->why($reason);
echo $this->how($how);
}
}

class Person
{
use Working;
}

$bob = new Person();
$where = '横浜で';
$why = 'お金欲しいから';
$reason = '営業する';
$bob->work($where, $why, $reason); // 横浜でお金欲しいから営業する



結果

ニャル子さんが言う通り、変更頻度が低い実装は、

traitに抜き出したほうが良さそう。

抽象クラスは多重継承した時に、やっかいなことになりそう。

そもそも多重継承ってなくした方がよさそう