🤪

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

2022/03/07に公開

これはなに?

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

コードは?

これだよ!

<?php

namespace Tyamahori\Validation;

use LogicException;
use ReflectionClass;
use ReflectionException;

trait NameSpaceValidation
{
    /**
     * @throws ReflectionException
     */
    public function acceptFromNamespace(string $nameSpace): void
    {
        foreach (debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3) as $backtrace) {

            // classが必ずあるわけではないため
            if (!isset($backtrace['class'])) {
                continue;
            }

            if ((new ReflectionClass($backtrace['class']))->getNamespaceName() === $nameSpace) {
                return;
            }
        }

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

使い方は?

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

<?php

namespace Tyamahori\Validation;

use ReflectionException;

class Example
{
    use NameSpaceValidation;

    /**
     * @throws ReflectionException
     */
    public function __construct()
    {
        $this->acceptFromNamespace('Tyamahori\Some\NameSpace');
    }


    /**
     * @return void
     */
    public function someMethod(): void
    {
      echo 'fugafuga';
    }
}

懸念点は?

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

Discussion