PHPでデコレーターパターンする

PHPでデコレーターパターンを簡単に書くためのスクリプトを書きました。

akrfjmt/decorated - Packagist

本来のデコレーターパターンはメソッドごとに挟みたい処理を書くのですが、PHPには__callというマジックメソッドがあり、メソッドを1つ定義すると全てのメソッド呼び出しに対して処理を挟むことができます。

  • インスタンスのメソッド呼び出しの前後で
    • トランザクションを張りたい
    • ログを出力したい
    • 実行時間を計測したい

みたいなときに使えると思います。

テストから抜粋
<?php
$yankeeDecorator = new TailDecorator('!?');
$cat = new Cat();

/** @var Cat|Decorated $decorated */
$decorated = new Decorated($cat, $yankeeDecorator);

/** @var Cat|Decorated $doubleDecorated */
$doubleDecorated = new Decorated($cat, $yankeeDecorator, $yankeeDecorator);

// '111222'
$cat->Concat('111', '222');

// 'abcdef!?'
$decorated->Concat('abc', 'def');

// '114514!?!?'
$doubleDecorated->Concat('114', '514');
デコレーターというよりAOPの出来損ないでは?

はい