PHPオブジェクト指向プログラミングでは、オブジェクトが特定のクラスのインスタンスであるかどうか、または特定のクラスから継承するかどうかを判断する必要があることがよくあります。 IS_A()関数はこれのために生まれます。オブジェクトとクラスの関係を判断する簡潔な方法を提供します。これは、多型とタイプチェックを実装するための重要なツールの1つです。
bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class :チェックするオブジェクトまたはクラス名。
$ class :比較するクラス名。
$ Allow_String :クラス名文字列を最初のパラメーターとして許可するかどうか、 Trueの場合、クラス名文字列はオブジェクトに限定されずに渡すことができます。
関数は、オブジェクトがクラスのクラスまたはサブクラスに属していることを示すためにtrueを返します。
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
if (is_a($dog, 'Animal')) {
echo "このオブジェクトはです Animal クラスの例,或其子クラスの例。";
} else {
echo "このオブジェクトはそうではありません Animal クラスの例。";
}
出力結果:
このオブジェクトはです Animal クラスの例,或其子クラスの例。
この例では、犬は動物のサブクラスであるため、 $犬もタイプの動物の対象と見なされます。
フレームワークを使用したり、構成ファイルをプロセスしたりすると、実際のオブジェクトの代わりにクラス名の文字列が表示される場合があります。現時点では、 IS_A()の3番目のパラメーターをTRUEに設定することにより、判断を達成できます。
class User {}
$className = 'User';
if (is_a($className, 'User', true)) {
echo "弦 '$className' 表されるクラス名はです User またはそのサブクラス。";
}
この方法は、クラスの自動荷重、依存関係注入、または工場モードに非常に役立ち、タイプを決定するためだけにオブジェクトを手動でインスタンス化する問題を効果的に回避できます。
IS_A()およびインスタンスオフオペレーターは機能がやや似ていますが、次の違いもあります。
InstanceOFはオペレーターであり、クラス名文字列に渡すことはできません。
IS_A()は、3番目のパラメーターを介してオブジェクトまたは文字列を渡し、制御動作を渡すことができる関数です。
IS_A()は、 InstanceOFよりもわずかに読み取り可能ですが、柔軟性が高くなります。
比較の例:
if ($dog instanceof Animal) {
// 使用 instanceof ジャッジタイプ
}
if (is_a($dog, 'Animal')) {
// 使用 is_a() ジャッジタイプ
}
オブジェクトのみを処理する場合は、 instanceofを使用することをお勧めします。文字列判断をサポートする必要がある場合は、 is_a()を使用する必要があります。
自動負荷メカニズムのクラス継承関係を決定します
$className = 'App\\Service\\UserService';
if (is_a($className, 'App\\Core\\BaseService', true)) {
// このクラスは、基本的なサービスクラスのサブクラスです,初期化または登録できます
}
工場モデルの法的カテゴリ
function createService($className) {
if (!is_a($className, 'App\\Service\\BaseService', true)) {
throw new Exception("違法サービス:$className");
}
return new $className();
}
プラグインシステムでのプラグインインターフェイスの実装を判断する
foreach ($pluginList as $pluginClass) {
if (is_a($pluginClass, 'PluginInterface', true)) {
$plugin = new $pluginClass();
$plugin->run();
}
}
PHP 5.3およびその後、 IS_A()関数のパフォーマンスと安定性が改善されているため、自信を持って使用できます。
渡されたクラス名が存在する必要があります。そうしないと、エラーがスローされます。クラスが定義されているかどうかわからない場合は、 class_exists()で使用できます。
if (class_exists($className) && is_a($className, 'SomeBaseClass', true)) {
// 安全判断
}
IS_A()は、特に文字列を通してタイプの判断を下す必要がある場合、オブジェクトが属するクラスを決定するためのPHPの実用的な機能です。 IS_A()を適切に使用することにより、特にオブジェクト指向の複雑なシステム、プラグインメカニズム、サービスコンテナなどのアーキテクチャに適したコードをより柔軟でスケーラブルにすることができます。