is_a(object|string $object_or_class, string $class, bool $allow_string = false): bool
$ object_or_class :オブジェクトまたはクラス名文字列にすることができます。
$ class :審査されるターゲットクラス名。
$ aopt_string :渡されたものがオブジェクトの代わりにクラス名の文字列である場合、このパラメーターはtrueに設定する必要があります。
例:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true
文字列を渡すこともできます:
var_dump(is_a('Dog', 'Animal', true)); // true
$object instanceof ClassName
例:
$dog = new Dog();
var_dump($dog instanceof Animal); // true
注: InstanceOFはオブジェクトにのみ使用でき、クラス名文字列に直接使用することはできません。
どちらもブール値を返し、オブジェクトが特定のクラスのインスタンスまたはサブクラスであるかどうかを判断します。しかし:
is_a()はよりリラックスしており、クラス名の文字列を判断できます( $ aplaw_string = trueの場合)。
InstanceOFはより厳格でオブジェクト指向であり、クラス名の文字列を判断することはできません。
ほとんどのシナリオでは、2つのパフォーマンスギャップは無視できます。しかし、言語の観点から見ると、 Instanceofはオブジェクトに直接作用し、パフォーマンスがわずかに優れているオペレーターです。 IS_A()は、特定の呼び出しオーバーヘッドを持つ関数です。
非常に頻繁なループでタイプの判断を実行しない限り、これにあまり注意を払う必要はありません。
IS_A()は、PHP 5の前に同様の内部関数であり、PHP 5以降の現在のフォームを正式にサポートしていました。
InstanceOFは言語オペレーターであり、サポートが安定しています。
コードを以前のバージョンと互換性のあるものにする必要がある場合、または関数呼び出し(関数オーバーライド、モックなど)を回避する必要がある場合、 InstanceOFはより信頼性が高くなります。
ユーザーが提供するクラス名を使用して判断を下す場合、 IS_A()は簡単に誤用されます。例えば:
$class = $_GET['class']; // ユーザーはクラス名を渡すことができます
if (is_a($object, $class)) {
// ...
}
このタイプの動的判断には、特定の安全リスクがあります。 InstanceOFを使用すると、タイプ構造をより適切に制約し、潜在的な注入や誤判断を回避できます。
次の理由で、最初にInstanceOfを使用することをお勧めします。
よりセマンティックで、オブジェクト指向のプログラミングスタイルに沿って。
エラーリスクの低下、より明確なタイプロジック。
わずかに優れたパフォーマンスとよりシンプルな表現。
数人がクラス名を動的に(工場モード、プラグインメカニズムなど)渡す必要がある場合、 IS_A()を使用できますが、明示的に$ Allow_String = trueを設定し、クラスで合格したものが安全で信頼できることを確認します。
例えば:
$class = 'App\\Plugins\\SomeHandler';
if (is_a($handler, $class, true)) {
$handler->handle();
}
参照ダイナミックプラグイン管理サンプルコードでホストされています。
https://m66.net/examples/plugin-loader.php