🤪

PHPでクラスの呼び出し元を縛る便利クラス作ったよ〜

2022/02/03に公開2

これはなに?

例えば、Hogeクラスを呼び出したいとなったとき、少なくともHogeBuilderクラス経由にてHogeクラスを呼び出したいなぁっとなったときに役立ててほしいです。

コードは?

これだよ!

<?php

namespace Package\Sample\BuilderPattern;

use LogicException;

class CreateClassHelper
{
    /**
     * new を禁止する
     */
    private function __construct()
    {
        // nop
    }


    /**
     * @param string $className
     * @param int $traceLimit
     * @return void
     */
    public static function shouldBeCalledFrom(
        string $className,
        int $traceLimit = 5
    ): void {

        foreach (debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $traceLimit) as $backtrace) {
            if (isset($backtrace['class']) && $backtrace['class'] === $className) {
                return;
            }
        }

        throw new LogicException(
            sprintf(
                'This method should be called from %s',
                $className
            )
        );
    }
}

使い方は?

呼び出し元を縛りたいクラスのコンストラクタで呼び出すといいかもー!

CreateClassHelper::shouldBeCalledFrom(SampleBuukderClass::class);

懸念点は?

debug_backtrace の使い方が本来の用途から逸脱してるっぽそう

Discussion

スースー

deptracの内容を実装で行っており、より詳細に指定するという点で、良いなと思いましたー!
依存の方向があまり決定せずに進んでしまったプロジェクトに利用することで、徐々に依存関係を良い方向に持っていくのに使えそうです!!!

@tyamahori@tyamahori

コメントありがとうございます!そうおっしゃっていただけると嬉しいです!
ただ、debug_backtrace をこの用途で本当に使っていいのかは悩んでいます。。汗