
PHPでTraitをより安全に実行するためにassertを使う
December 21, 2016,
tags:
php
assert
trait
再演で@t_wadaさんのPHP7で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計を聞いて、本当に様々な発見がありました。
その中でもassertの使い方は本当に勉強になりました。(とはいえ、そんなにちゃんとassertの使い所を理解しているわけではありませんが・・・)
「発生した暗黙の前提をassertを使って評価式で書き、明示する」
これってtraitでも使えるんじゃないかなぁーなんて思うんですよね。
Traitは怖い
こんな実装があったとして、本当にcountUp()
が実装されているの?って不安になるわけですよ。
<?php
class Counter
{
private $count = 0;
public function countUp(): int
{
$this->count++;
return $this->count;
}
}
<?php
trait OutputTrait
{
public function output()
{
echo 'hello '. $this->countUp();
}
}
assertを使って不安を取り除く
こんな感じにassertを使って「countUp
メソッドが必要ですよ」と前提条件を明示することによって、より安全にTraitが使えるのかと思います。
<?php
trait OutputTrait
{
public function output()
{
assert(method_exists($this,'countUp'));
echo 'hello '. $this->countUp();
}
}
最後に
もっと良いやり方があるような気もしますが。
しかし、より安全にTraitを使うためにassertを使うのも良い気がします。