bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class :チェックするオブジェクトまたはクラス名( $ aopt_string = trueが設定されている場合)。
$ class :比較するターゲットクラス名。
$ aopt_string :着信クラス名文字列を最初のパラメーターとして許可するかどうか(デフォルトのFALSE 、PHP 5.3.9+によってのみサポートされている)。
関数はブール値を返します: true $ object_or_classが$ classクラスまたはそのサブクラスのインスタンスである場合。それ以外の場合、 false 。
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
if (is_a($dog, 'Animal')) {
echo "はい Animal クラスまたはそのサブクラスのインスタンス";
} else {
echo "不はい Animal クラスまたはそのサブクラスのインスタンス";
}
出力:
はい Animal クラスまたはそのサブクラスのインスタンス
この例では、 $犬は犬の例ですが、犬が動物を継承するため、 is_a()は真実に戻ります。
インスタンスオブジェクトの代わりにクラス名文字列のみがある場合があります。 3番目のパラメーター$ aopt_string = trueを設定することにより、クラス間の継承関係を決定できます。
class Animal {}
class Cat extends Animal {}
$className = 'Cat';
if (is_a($className, 'Animal', true)) {
echo "$className はい Animal サブクラスまたはそれ自体";
}
これは、反射や依存関係の注入などの動的なクラス名を扱う場合に非常に便利です。
コンテンツ管理システムに複数のプロセッサクラスがあると仮定し、各クラスが抽象クラスのベースプロセッサから継承します。実行する前に、現在ロードされているプロセッサクラスが準拠しているかどうかを確認したいと思います。
abstract class BaseProcessor {
abstract public function process();
}
class MarkdownProcessor extends BaseProcessor {
public function process() {
// 対処する Markdown コンテンツ
}
}
function runProcessor($processor) {
if (!is_a($processor, 'BaseProcessor')) {
throw new Exception("无效対処する器!");
}
$processor->process();
}
$proc = new MarkdownProcessor();
runProcessor($proc);
渡されたオブジェクトがベースプロセッサを継承しないオブジェクトである場合、システムはランタイムエラーを回避するために例外をスローします。
PHPにはオペレーターインスタンスもあります。これは、同様の判断を下すためにも使用できます。では、 is_a()とinstanceofの違いは何ですか?
比較する | is_a() | instanceof |
---|---|---|
タイプ | 関数 | オペレーター |
文字列を許可します | はい(3番目のパラメーターが真実である必要があります) | いいえ |
読みやすさ | より良い(より多くのロジック) | より一般的に使用される簡潔な文法 |
バージョンサポート | PHP 4+、PHP 5.3.9+は文字列判断をサポートしています | PHP 5+ |
実際の開発では、それがオブジェクトインスタンスの判断である場合、インスタンスを使用する方が一般的です。また、クラス名の文字列を判断する必要がある場合、 is_a()の方が適しています。
パフォーマンスの問題: IS_A()は下部の反射操作です。これはインスタンスよりもわずかに遅くなりますが、一般的に高周波呼び出しで検討する必要がない場合を除き、ギャップは非常に小さいです。
クラスが存在するかどうか: is_a()を使用する前に、ターゲットクラスが存在することを確認し、それ以外の場合はエラーが発生する可能性があります。 Class_exists()を使用して、最初に判断を下すことができます。
PSRの仕様と設計のアイデア: IS_A()の合理的な使用は、タイプの安全性を高めることができますが、過度の依存性は、開放性と閉鎖の原則に違反する可能性があります。インターフェイスで使用することをお勧めします。