is_a(object $ object、string $ class_name、bool $ awal_string = false):bool
$オブジェクトを検出します
$ class_nameクラス名文字列
オブジェクトがクラスまたはそのサブクラスに属している場合はtrueを返し、それ以外の場合はfalseを返します
例:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Dog')); // true
var_dump(is_a($dog, 'Animal')); // true,なぜなら Dog 継承 Animal
var_dump(is_a($dog, 'Cat')); // false
オブジェクトが犬、猫、または鳥のいずれかに属しているかどうかを判断したいとします。最も一般的な方法は次のとおりです。
if (is_a($obj, 'Dog') || is_a($obj, 'Cat') || is_a($obj, 'Bird')) {
// オブジェクトは、これら3つのクラスのいずれかに属します
}
多くの種類の判断がある場合、書くのは不便であり、メンテナンスを助長しません。
関数をカプセル化し、オブジェクトとクラス名の配列を渡すことができ、関数はオブジェクトがこれらのクラスのいずれかに属しているかどうかを返します。
function is_a_any($object, array $classNames): bool {
foreach ($classNames as $className) {
if (is_a($object, $className)) {
return true;
}
}
return false;
}
使用例:
$classes = ['Dog', 'Cat', 'Bird'];
if (is_a_any($obj, $classes)) {
echo "オブジェクトはクラスの1つに属します";
} else {
echo "オブジェクトはこれらのクラスに属していません";
}
PHPのクラス名はケース非感受性ですが、厳密なために、判断するときに均一にケースができます。
function is_a_any($object, array $classNames): bool {
foreach ($classNames as $className) {
if (is_a($object, $className)) {
return true;
}
}
return false;
}
実際、 IS_A()自体はすでに症例に依存しないため、追加の処理を行う必要はありません。
また、オブジェクトが特定のインターフェイスを実装しているかどうかを判断する場合は、 is_a()も適用されます。
<?php
class Dog {}
class Cat {}
class Bird {}
class Bulldog extends Dog {}
function is_a_any($object, array $classNames): bool {
foreach ($classNames as $className) {
if (is_a($object, $className)) {
return true;
}
}
return false;
}
$bulldog = new Bulldog();
$checkClasses = ['Cat', 'Bird', 'Dog'];
if (is_a_any($bulldog, $checkClasses)) {
echo "オブジェクトは、指定されたクラスの1つに属します";
} else {
echo "オブジェクトはこれらのクラスに属していません";
}
実行結果:
オブジェクトは、指定されたクラスの1つに属します
ブルドッグは犬のサブクラスだからです。
IS_A()は、オブジェクトが特定のクラスに属しているかそのサブクラスに属しているかを検出するために使用されます。
複数のクラスを判断するときは、ループカプセル化関数is_a_any()を使用してクラス名配列に渡します
柔軟で簡潔な機能、メンテナンスと拡張が簡単です
このような機能をカプセル化することにより、コードはよりエレガントで理解しやすく、開発で一般的に使用される実用的な手法です。