🤪
PHPでクラスの呼び出し元を【namespace】で縛る便利クラス作ったよ〜
これはなに?
例えば、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