毎日のPHP開発では、変数が特定のクラスのインスタンスであるかどうかを確認する必要があることがよくあります。 PHPは、オペレーターのInstanceなどの種類を判断するさまざまな方法を提供しますが、 IS_A()関数は、その柔軟性とシンプルさのために多くの開発者にとって最初の選択肢となっています。
この記事では、 IS_A()関数に基づいてシンプルなタイプ検証ツールクラスを構築するために段階的に説明し、オブジェクトの種類を迅速に判断し、コードの読みやすさと再利用性を向上させるのに役立ちます。
IS_A()は、PHPによって提供される組み込み関数であり、オブジェクトがそのクラスの特定のクラスに属しているかどうかを判断するために使用されます。
bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class :チェックするオブジェクトまたはクラス名。
$クラス:ターゲットクラス名。
$ aopt_string :オブジェクト名を文字列で渡すことを許可するかどうか(静的呼び出しの場合)。
IS_A()関数を使用して、シンプルなツールクラスのTypeCheckerをカプセル化して、タイプの判断ロジックを簡素化および中央に管理します。
<code>
class TypeChecker
{
/**
* オブジェクトが特定のクラスのインスタンスであるかどうかを判断します
*
* @param object|string $objectOrClass
* @param string $expectedClass
* @param bool $allowString
* @return bool
*/
public static function isInstanceOf($objectOrClass, string $expectedClass, bool $allowString = false): bool
{
return is_a($objectOrClass, $expectedClass, $allowString);
}
/**
* 複数のオブジェクトタイプのバッチ検証
*
* @param array $objectsWithExpectedClasses
* @return array
*/
public static function validateMultiple(array $objectsWithExpectedClasses): array
{
$results = [];
foreach ($objectsWithExpectedClasses as $label => [$objectOrClass, $expectedClass]) {
$results[$label] = self::isInstanceOf($objectOrClass, $expectedClass);
}
return $results;
}
}
</code>
このクラスは2つの方法を提供します。
isinstanceof() :単一のオブジェクトのタイプを確認します。
validatemultiple() :オブジェクトとクラスの間の対応のバッチ検証をサポートします。
このツールクラスが実際のプロジェクトでどのように使用されているかを見てみましょう。
<code>
interface LoggerInterface {}
class FileLogger implements LoggerInterface {}
class MailLogger {}
$logger1 = new FileLogger();
$logger2 = new MailLogger();
// 単一の検証
if (TypeChecker::isInstanceOf($logger1, LoggerInterface::class)) {
echo "logger1 はい LoggerInterface 例\n";
}
// バッチ検証
$results = TypeChecker::validateMultiple([
'fileLogger' => [$logger1, LoggerInterface::class],
'mailLogger' => [$logger2, LoggerInterface::class],
]);
print_r($results);
</code>
出力の結果は次のとおりです。
logger1 はい LoggerInterface 例
Array
(
[fileLogger] => 1
[mailLogger] =>
)
構成ファイルからクラスを動的にロードし、オブジェクトをインスタンス化する工場クラスを開発しているとします。 TypeCheckerを使用して、これらのクラスが目的のインターフェイスを実装し、実行時にタイプエラーを回避することができます。
<code>
class LoggerFactory
{
public static function create(string $className): LoggerInterface
{
$instance = new $className();
if (!TypeChecker::isInstanceOf($instance, LoggerInterface::class)) {
throw new InvalidArgumentException("親切 $className 達成する必要があります LoggerInterface インタフェース");
}
return $instance;
}
}
$logger = LoggerFactory::create('FileLogger'); // 普通
$logger = LoggerFactory::create('MailLogger'); // 例外を投げます
</code>
IS_A()を介して単純なタイプ検証ツールのクラスをカプセル化すると、コードの堅牢性と読みやすさが大幅に向上する可能性があります。小規模および中規模のプロジェクトでの基本的なタイプの検出であろうと、大規模なフレームワークのセキュリティチェックレイヤーとしてであろうと、便利になる可能性があります。
完全な検証システムをさらに構築する場合は、URLソースや依存関係インジェクションクラスなどのロジックを追加して確認することもできます。たとえば、クラスが必要なインターフェイスを実装するか、特定のベースクラスを継承するかをサービスレジストリで確認すると、ビジネスロジックの隠されたエラーを防ぐことができます。